如何使用Mockito通过单元测试?

时间:2019-06-14 07:28:30

标签: java junit mockito

我对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?为什么?

2 个答案:

答案 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);
    }
}