如何使用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 ?为什么?

因为测试方法中的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.您正在将字符串生成器对象与字符串进行比较,这也需要更正。

相关内容

  • 没有找到相关文章

最新更新