我想澄清TDD范围内的重构.
之前:
class Somclass{
public void sendMessage(){
WebServiceStub stub = new WebServiceStub();
...
stub.sendMsg();
}
}
后:
class Somclass{
private WebServiceStub stub;
public void sendMessage(){
...
if(stub == null){
stub = new WebServiceStub();
}
...
stub.sendMsg();
}
}
所以我想验证sendMsg()方法并使用result生成一些断言.为了具有模拟此存根的可能性,我将此存根局部变量移动到实例变量.这样我就可以将mock存根设置为类,并在测试类中进行verivyings和asserts.例如:
@Test
public void testSMth(){
wsProvider.setStub(stubMock);
verify(stubMock).sendMsg();
...asserts
}
这种方法不是线程安全,我应该做一些并发修改.这种修改可能会导致错误.所以在局部变量approce中有线程安全.
此外,我可以创建将返回WebServiceStub实例的Factory.但这种方法会产生新的课程,因为这种情况经常发生.
有一个问题:如何测试这种情况并进行可能导致错误的测试成本修改?
解决方法:
您的类应该将WebService对象(我拒绝将其称为“存根”)作为字段.
class Someclass{
@Resource
private WebService ws;
public void sendMessage(){
ws.sendMsg();
}
}
它应该注入您选择的DI框架.在测试中,您可以将其设置为模拟.没有必要使用懒惰的getter,因为你的意思是不是线程安全的.