【问题标题】:Grails integration tests with multiple servicesGrails 与多个服务的集成测试
【发布时间】:2012-06-13 14:07:21
【问题描述】:

测试依赖于另一个服务的 Grails 服务的最佳实践是什么? 默认 mixin TestFor 正确注入被测服务,例如:

@TestFor(TopService) 
class TopServiceTests {
    @Test
    void testMethod() {
        service.method()
    }
}

但如果我的 TopService(服务)实例依赖于另一个服务,例如 InnerService:

class TopService {
    def innerService
}

innerService 将不可用,依赖注入似乎没有填充此变量。我应该如何进行?

【问题讨论】:

  • 尝试在你的测试中扩展GroovyTestCase

标签: unit-testing grails integration-testing grails-2.0


【解决方案1】:

集成测试不应该使用@TestFor注解,它们应该使用extend GroovyTestCase。测试注释仅用于单元测试(在集成测试中使用时会出现不良行为,尤其是@Mock 注释)。您现在看到了其中一种不良行为。

如果你扩展GroovyTestCase,那么你就可以拥有

def topService

在测试的顶部,它会被注入所有注入的依赖项。

对于单元测试用例,您只需在 setUp 方法中将关联服务的新实例添加到您的服务中。就像:

@TestFor(TopService) 
class TopServiceTests {
    @Before public void setUp() {
        service.otherService = new OtherService()
    }
    ...

【讨论】:

  • 谢谢!我终于通过您的解释理解了它;)我被stackoverflow.com/questions/2272677/…“集成测试不应扩展GrailsUnitTestCase”的cmets 误导了。不确定我是否完全理解 GroovyTestCase 和 GrailsUnitTestCase 之间的区别...
  • 最大的不同(最终会咬人)是单元测试用例在 setUp 和 tearDown 上模拟和弄乱元类的方式更多。模拟是集成测试不需要的东西,因为它们已经注入了真实的东西。这也意味着当集成测试完成时,运行单元测试 tearDown 是不好的,因为它可以删除应该存在的元类(如动态 GORM 方法)的更改以及后续集成测试所期望的更改。跨度>
【解决方案2】:

我有一个 CustomerRegistrationServiceTest,我的 CustomerRegistrationService 依赖于 PasswordService。

我的 CustomerRegistrationService 只是像往常一样自动连接:

class CustomerRegistrationService {
    def passwordService

在我的 CustomerRegistrationServiceTest 我有:

@TestFor(CustomerRegistrationService)
@Mock(Customer)
class CustomerRegistrationServiceTests extends GrailsUnitTestMixin {

    void setUp() {
        mockService(PasswordService)
    }

所以当我测试 CustomerRegistrationService 时,它​​能够访问 PasswordService

【讨论】:

  • 谢谢。事实上,嘲笑似乎是要走的路,但更多的是单元测试恕我直言。对于集成测试,我宁愿测试成熟的环境。
猜你喜欢
  • 2013-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-06
  • 2011-05-07
  • 1970-01-01
相关资源
最近更新 更多