如何在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)轻松解决它?
答案 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;
}
}