Grails项目设置和约定 - 测试一个真正不是服务的spring组件

时间:2012-10-29 20:35:12

标签: unit-testing grails conventions

起初我不得不说,我有更多的背景,而不是grails,当你没有卡片时,后来的配置有点令人不安。

考虑一个grails项目。

如果我有一个'Component'(一个POJO的Spring术语将在spring上下文中),它不是真正的服务,而是更多的另一个对象的一部分,我应该把它放在哪里?在src / groovy或grails / services中? 看起来第二个选项让我有更多的力量来编写我的测试,因为Grails将Service视为:

  

Grails中的服务是放置大部分逻辑的地方   你的申请

我觉得grails / services dir是所有Springified bean的一种包......

接下来的问题,如果我需要在Spring上下文中为该服务提供一些随播bean,我该如何单元测试我的组件/服务。 这个协同服务器不是服务,而是运行时必需的其他组件,但我可以使用默认实现。

使用spring,我可以简单地使用这种注释为我的测试创建一个小上下文:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "/simple-job-launcher-context.xml", 
                                    "/jobs/skipSampleJob.xml" })

如何使用Grails做同样的事情? 我想知道是否有一种首选的方法来创建一个可以重复使用和组合的小型Spring上下文,我可以使用 @ContextConfiguration 注释进行测试。

有了所有隐藏的grails惯例,我担心不会以正确的方式使用(如果存在的话)但是对它们的明确解释使我开始直接使用Spring。

2 个答案:

答案 0 :(得分:1)

将它放在src / groovy或src / java(取决于实现语言)是一种常见的方法,并且在我的经验中运作良好。

就单元测试而言,如果你需要一个'伴侣豆'来进行测试,那么它并不是真正的单元测试。嘲笑对象怎么样?有几个使用grails的模拟/测试库 - Spock是我个人的最爱。

答案 1 :(得分:0)

我有RTFM,答案就在那里,在页面中间有点淹死: http://grails.org/doc/2.0.x/guide/testing.html

测试Spring Beans

  

当使用TestFor时,只有一部分可用的Spring bean   正在运行Grails应用程序。如果你想做   您可以使用defineBeans方法执行其他Bean   GrailsUnitTestMixin的:

class SimpleController {
    SimpleService simpleService
    def hello() {
        render simpleService.sayHello()
    }
}
void testBeanWiring() {
    defineBeans {
        simpleService(SimpleService)
    }
controller.hello()
assert response.text == "Hello World"
}

  

控制器由Spring自动连接,就像正在运行的Grails一样   应用。如果您实例化后续操作,则甚至会发生自动装配   控制器的实例:

void testAutowiringViaNew() {
    defineBeans {
        simpleService(SimpleService)
    }
def controller1 = new SimpleController()
    def controller2 = new SimpleController()
assert controller1.simpleService != null
    assert controller2.simpleService != null
}