在单元测试下的服务类中模拟一个方法

时间:2014-09-23 14:27:21

标签: unit-testing groovy grails-2.0 gunit

我有一个服务类,它有两个方法(一个是公共的,另一个是受保护的)。我正在尝试对我的代码进行单元测试。以下是代码段 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()返回结果,即两个方法都在单元测试下的同一服务类中。如何模拟并完成任务?

3 个答案:

答案 0 :(得分:1)

你当然不能模拟被测试的课程,否则你只是在测试模拟。

你可能会更好,将myMethod2()移到另一个班级。想一想MyServiceClasstrying to do too much

修改

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

选项1

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

选项2

可以使用Mockito to Spy the class under test,但这是一种非正统的方法。

如果您有控件

,我仍然建议您重构代码

答案 1 :(得分:1)

您是否尝试过metaClass?

service.metaClass.myMethod2 = { return whatever }

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

我滥用metaClass可能比我应该更多但是当你无法想出更好的做事方式时它会很棒。

答案 2 :(得分: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]
 }

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