проблема с тестом mockito для блока try catch с логом slif4j - PullRequest
0 голосов
/ 16 января 2019

Я пишу тест для блока try catch, но я не совсем понимаю, как тестировать блок catch ... особенно он использует slf4j для регистрации ошибки.

addText - это еще один метод из того же класса.

public class TextQueue {
  public void addTextToQueue(final Text text) {
            try {
                if (text != null) {
                    addText(text);
                }
            } catch (final JsonProcessingException e) {
                LOGGER.error("Error adding text to the queue : {}", e);
            }
        }
}

вот мой тестовый пример

@RunWith(MockitoJUnitRunner.class)
public class TextQueueTest {
private org.slf4j.Logger LOGGER = LoggerFactory.getLogger(TextQueueTest.class);

private static final String MY_TEXT = "src/text.json";
private Text text;
private final ObjectMapper mapper = new JacksonConfig().dateAsStringObjectMapper();

@Mock
private TextQueue textQueue;

@Before
public void setUp() throws IOException {
    text = mapper.readValue(new File(TextQueueTest.MY_TEXT), Text.class);

}

@Test
public void addTextToQueue() {
    try{
        textQueue = spy(textQueue);
        textQueue.addTextToQueue(text);
    }catch(final Exception e){
        LOOGER.error("add text to queue threw an error" + e);
    }
}

Может кто-нибудь помочь мне решить эту проблему?

1 Ответ

0 голосов
/ 16 января 2019

Прежде всего, вы должны действительно прочитать хороший учебник о Mockito, такой как vogella . Видите ли, вы просто складываете много вещей, которые бессмысленны .

Как:

@Mock
private TextQueue textQueue;

чтобы потом иметь

textQueue = spy(textQueue);

в вашем тестовом случае. Вы должны быть действительно ясно об этом. Шпион строится на реальном экземпляре тестируемого вами класса. Создание шпиона, который шпионит за издевательством, как сказано: это не имеет смысла.

Тогда:

}catch(final Exception e){
    Logger.error("add text to queue threw an error" + e);

Опять бессмысленно. Вся идея ваших юнит-тестов заключается в том, что они терпят неудачу , когда что-то не так. Когда ваш производственный код выдает неожиданные исключения, вы не регистрируете их, а просто позволяете им в конце пройти ваш тестовый случай.

Чтобы ответить на реальный вопрос: он выглядит , как будто ваш производственный код использует конкретный «постоянный» экземпляр регистратора. Учитывая этот дизайн, единственный способ проверить ваш производственный код будет:

  • сделать этот ЛОГГЕР поддельным объектом
  • каким-то образом внедрить его в экземпляр underTest вашего производственного кода класса
  • вызвать этот метод для тестирования на underTest (и каким-то образом заставить метод вызвать исключение)
  • убедитесь, что поддельный регистратор увидел ожидаемый вызов error()

Мы не можем дать лучший совет, потому что вашего кода недостаточно, мы действительно не знаем, что делает ваш производственный класс (например: мы не знаем, что такое LOGGER и куда он идет from. Если это статическая переменная, то, скорее всего, вы не можете получить «контроль» над ней с помощью Mockito).

В любом случае вам, вероятно, действительно нужен концепт spy . Чтобы протестировать addTextToQueue(), вам нужен способ вызова «реальной» реализации addTextToQueue(), но вызов addTser() внутри должен перейти к макету (чтобы вы могли контролировать, что делает этот вызов).

Но, как уже было сказано: начните с действительно , исследуя, как работает Mockito, вместо того, чтобы собирать воедино вещи, которые не имеют смысла в каком-то подходе "проб и ошибок". Правильное модульное тестирование с использованием насмешек сложно, вы не можете узнать это методом «проб и ошибок».

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