2

我有一个服务类,它有两种方法(一种是公共的,另一种是受保护的)。我正在尝试对我的代码进行单元测试。下面是代码片段 MyServiceClass.groovy

class MyServiceClass {

       public boolean myMethod1() {
            // some code
            boolean success = myMethod2()
            // some code
       }

      public boolean myMethod2() {
          // some logic to return true/false
          return true
      }

}

MyServiceClassTests.groovy

class MyServiceClassTests {

      void testMyMethod1() {
           // unit test code
      }

}

在上面的单元测试代码中,我想模拟 myMethod1() 调用的 myMethod2() 返回结果,即这两个方法都在同一个单元测试的服务类中。如何模拟它并完成工作?

4

3 回答 3

1

你当然不能模拟被测类,否则你只是在测试一个模拟。

你可能会过得更好,myMethod2()进入另一个班级。想想是MyServiceClass不是做的太多了

编辑

您要求的答案不需要移动 myMethod2()

选项1

创建一个新的子类作为被测类而不是 MyServiceClass。您的新类应该扩展 MyServiceClass,然后您可以覆盖myMethod2()并提供不同的“仅测试”实现。

选项 2

可以使用Mockito 来监视被测类,但这是一种非正统的方法。

如果您有控制权,我仍然建议重构代码

于 2014-09-23T14:54:10.337 回答
1

您是否尝试过元类?

service.metaClass.myMethod2 = { return whatever }

http://groovy.codehaus.org/JN3525-MetaClasses

我滥用 metaClass 可能比我应该做的要多,但是当您无法想出更好的做事方式时,这很好。

于 2014-09-24T03:38:30.597 回答
0

有一个非常酷的技巧,您可以在其中模拟服务的选定方法,同时保持服务的总体完整性,就像这样......

def method1(){
    ...
   def result = method2(param)
   return result
}


def method2(Type param){
    ...
   return result
}


void "Test method1"() {
        given:

        def service = [
                method2: {Type param -> [1,2,3,4]}
        ] as MyService

        when:
            def result = service.method1()

        then:
            result.count == 4
            result == [1,2,3,4]
 }

我本质上说的是,您可以通过定义一个包含方法名称作为键的映射和一个包含参数和模拟值作为值的闭包来模拟服务的方法。

于 2018-04-18T13:13:45.643 回答