我如何理解Mockito.mock创建服务(或其他对象(的存根。
我有简单的处理程序:
public class Handler
{
private HttpSender sender;
public Handler(BigInteger sessiongId) {
RequestHelper helper = RequestHelper.getInstance();
String requestAsText = helper.getCurrentRequest(sessiongId);
StringBuilder stringBuilder = new StringBuilder(requestAsText);
run(stringBuilder);
sender = SenderGenerator.getInstance().create(stringBuilder.toString());
}
public void run(StringBuilder str) {
str.delete(0, 2);
}
}
如何使用 Mockito 通过此处理程序的测试?
public class HandlerTest
{
@Test
public void testRun()
{
StringBuilder str = new StringBuilder("1234");
Handler handler = Mockito.mock(Handler.class);
handler.run(str);
Assert.assertEquals("34", str);
}
}
此测试的实际结果是 1234 ?为什么?
因为测试方法中的haldler对象是一个模拟对象而不是一个真实对象,所以方法调用handler.run(str(不会做任何事情,只要你不告诉它该做什么。
因此,一个解决方案是告诉模拟对象像这样调用真正的方法:
public class HandlerTest {
@Test
public void testRun() {
StringBuilder str = new StringBuilder("1234");
Handler handler = Mockito.mock(Handler.class);
when(handler.run(any(StringBuilder.class))).thenCallRealMethod();
handler.run(str);
Assert.assertEquals("34", str.toString());//add toString here, because you are comparing a String to a StringBuilder
}
}
测试此方法的另一种方法是将其设置为静态,这样您甚至不需要模拟任何东西:
public class Handler {
public Handler(BigInteger sessiongId) {
//...
}
public static void run(StringBuilder str) {
str.delete(0, 2);
}
}
您的测试方法如下所示:
public class HandlerTest {
@Test
public void testRun() {
StringBuilder str = new StringBuilder("1234");
Handler.run(str);
Assert.assertEquals("34", str.toString());
}
}
两件事:1.你嘲笑了你想测试的班级。而且您也没有为模拟定义任何特定行为。因此,跳过了对测试方法本身的调用。你可能不得不考虑嘲笑的目的是什么?2.您正在将字符串生成器对象与字符串进行比较,这也需要更正。