java – 重构以编写“漂亮”的JUnit测试

我想澄清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,因为你的意思是不是线程安全的.

上一篇:java – 如何在Mockito中存储varargs以仅匹配一个参数


下一篇:java – 为什么执行Mockito mocks的性能如此不稳定?