2

起初我不得不说我对 Spring 的背景比 grails 更多,当你没有卡片时,后来的约定优于配置有点令人不安。

考虑一个 grails 项目。

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

Grails 中的服务是将大部分逻辑放入应用程序的地方

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

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

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

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

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

由于 grails 的所有隐藏约定,我害怕不使用正确的方式(如果存在的话),但是对它们的清晰解释促使我直接使用 Spring。

4

2 回答 2

1

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

就单元测试而言,如果您需要一个“伴侣 bean”来进行测试,那么它就不是真正的单元测试。模拟对象怎么样?有几个可以与 grails 一起使用的模拟/测试库——Spock 是我个人的最爱。

于 2012-10-29T21:29:01.240 回答
0

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

测试 Spring Bean

使用 TestFor 时,只有一部分可用于正在运行的 Grails 应用程序的 Spring bean 可用。如果您希望提供额外的 bean,您可以使用 GrailsUnitTestMixin 的 defineBeans 方法:

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
}
于 2012-10-30T14:35:24.887 回答