我对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?为什么?
答案 0 :(得分:0)
两件事: 1.您嘲笑了您要测试的类。而且您也没有为模拟定义任何特定的行为。因此,将跳过对测试方法本身的调用。您可能必须考虑嘲笑的目的是什么? 2.您正在将StringBuilder对象与String进行比较,该对象也需要更正。
答案 1 :(得分:0)
由于测试方法中的haldler对象是模拟对象而不是真实对象,因此方法调用handler.run(str)不会做任何事情,只要您不告诉该怎么做即可。
因此,一种解决方案是告诉模拟对象像这样调用真实方法:
"R.id.search_close_btn"
测试此方法的另一种方法是使其静态,因此您甚至不需要模拟任何东西:
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);
}
}