如何模拟自动装配对象(java)并在Spock中将其注入间谍对象

时间:2019-06-24 03:42:37

标签: java junit mockito spock powermockito

如何在Spock中将模拟对象注入到间谍实例中?

示例:

TestClass

class Service {

     @AutoWired
     private Util util;

     public void testMethod(int a, int b) {

         int c = sum(a,b);
         util.format(c);
     }

     private int sum(int a, int b) {
        ......
     }
}

Spock:

def "testMethod with valid inputs"() {

    given:
       def serviceSpy    = Spy(Service)
       //spy.util          = Mock(Util) I can't do this
       spy.sum(_,_) >> 2

    ......
}

所以,我的疑问是如何将模拟对象注入到间谍实例中?

我试图监视现有实例,但它没有对测试类中的方法进行存续。

有人可以建议我,我在这里可以做什么?还是可以使用Junit(Mockito)轻松解决它?

1 个答案:

答案 0 :(得分:0)

您可以使用“ constructorArgs”

这里是一个例子:

def util = Stub(Util) // or whatever
def serviceSpy = Spy(Service, constructorArgs: [util])

但是,要使其工作,请不要在字段上使用@Autowire。抛开弹簧在现实生活中运行的事实,对于这样的测试,您可能没有弹簧。 因此,显式放置依赖项引用将破坏封装,并且在任何情况下均不起作用。

相反,我建议使用构造函数依赖项:

class Service {

    private final Util util;

    @Autowired // in recent versions of spring no need to use this annotation
    public Service(Util util) {  
      this.util = util;
    }
}