【问题标题】:Need to mock one service method only in an integration test只需要在集成测试中模拟一种服务方法
【发布时间】:2014-03-03 19:45:13
【问题描述】:

我正在编写 grails 集成测试,它调用一个控制器,该控制器调用一个服务,该服务调用另一个服务,该服务调用另一个服务。

Controller -> ServiceA.method1()  -> ServiceB.method2() -> ServiceC.method3()

要调用的最后一个服务中的最后一个方法 (ServiceC.method3()) 调用外部世界(另一个 JVM)并返回一个结果,我想为我的集成测试模拟该结果。因此,我仍在测试该特定服务方法的往返链。

我正在阅读 grails 中的模拟,但似乎只有在单元测试中才有可能。

有任何提示如何进行此操作吗?

【问题讨论】:

  • 提示:1. Beans 在集成测试中是自动连接的。 2.metaClass可用于添加/模拟行为。

标签: grails groovy mocking integration-testing


【解决方案1】:

使用元类覆盖方法的功能。我一直在我的集成测试中这样做作为我的模拟方式。

所以在你的测试方法中做这样的事情(注意方法 arg 类型必须与真实方法完全匹配):

controller.serviceA.serviceB.serviceC.metaClass.method3 = { Args args ->
    // do whatever you want here, set flags to indicate method called,
    // assert args, declare return types, etc
    // return 'mocked' result
}

确保在您的集成测试拆解方法中重置此服务的元类,否则您的所有其他 int 测试将具有相同的定义:

controller.serviceA.serviceB.serviceC.metaClass = null

【讨论】:

    【解决方案2】:

    我正在阅读有关在 grails 中模拟的内容,但似乎只是 可以在单元测试中使用。

    这当然不是真的。 您可以在单元测试和集成测试中使用 Groovy 中可用的所有模拟方式。

    使用 Map coercion 进行模拟,就这么简单:

    controller.serviceA.serviceB.serviceC = [method3: {return 'MockValue'}] as ServiceC
    

    【讨论】:

      猜你喜欢
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 2019-11-10
      • 1970-01-01
      • 1970-01-01
      • 2021-04-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多