如何使用Spock模拟重载的Java方法

时间:2017-02-10 22:43:25

标签: java unit-testing groovy spock

我有一个带有重载方法过程的Java类MyClass:

class MyClass {
    private String process(String requestId, String request) {
       // Initial processing, creates processObject from request
       // then class actual processing:
       String temp = process ( processObject );
       // do stuff I want to test, generate response
       return response;
    };
    private String process( ProcessClass processObject ) {
       String result;
       // do actual processing of processObject
       return result;
    }
}

我想使用Spock测试第一个process()方法。我试图使用Spy来模拟重载过程(ProcessClass)。到目前为止,这里是testProcess.groovy:

class TestProcessUsingString extends Specification {
   given:
      def testInput = "TestInput"
      def myObject = Spy(MyClass) {
         process(_ as ProcessClass) >> "My result string"
      }
   when:
      def response = myObject.process("TestInput")
      // Check response

这个方法不能像我期望的那样模拟方法过程(ProcessClass ...)。我咨询了http://spockframework.org/spock/docs/1.0/interaction_based_testing.html,但我无法理解。

如何模拟MyClass.process(ProcessClass)以便我可以从中返回一个假答案并将其传递给其他流程函数?

1 个答案:

答案 0 :(得分:0)

Spock模拟,存根和间谍基于Java或CGLIB动态代理。这些反过来创建运行时的子类,覆盖所有 public 方法并挂钩它们以提供模拟测试所需的精美功能。但是,您使用私有方法,这解释了为什么这不起作用。此外,除非绝对必要,否则测试私人方法和使用间谍是不好的做法。什么使得有必要在这里使用间谍?