Как сделать модульный тест пройденным с использованием Mockito? - PullRequest
0 голосов
/ 14 июня 2019

Насколько я понимаю, 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 голосов
/ 14 июня 2019

Поскольку ваш объект 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());
    }
}
0 голосов
/ 14 июня 2019

Две вещи: 1. Вы высмеяли тот самый класс, который хотите проверить.И вы не определили никакого конкретного поведения для макета.Таким образом, вызов самого метода теста пропускается.Возможно, вам придется подумать над тем, что было целью насмешки?2. Вы сравниваете объект StringBuilder со строкой, которую тоже необходимо исправить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...