Странная проблема с выполнением тестов с помощью junit

#java #junit #tdd

#java #junit #tdd

Вопрос:

Я пишу небольшую библиотеку для фильмов для себя. Отчасти это для изучения TDD. Теперь у меня проблема, которую я не могу решить.

Код находится здесь https://github.com/hasanen/MovieLibrary/blob/master/movielibrary-core/src/test/java/net/pieceofcode/movielibrary/service/MovieLibraryServiceITC.java

Проблема в том, что когда я запускаю весь класс (щелкните правой кнопкой мыши над именем класса в eclipse), второй тест завершается неудачей, потому что удаление не завершается успешно. Но при щелчке правой кнопкой мыши на методе (getMovieGenres_getAllGenresAndRemoveOne_returnsTwoGenreAndIdsAreDifferent) и выборе Run as Junit Test это работает.

Мне не обязательно нужно исправление, но хотя бы несколько советов о том, как выяснить, почему junit ведет себя подобным образом.

Комментарии:

1. Переменная movieLibraryService имеет аннотацию @Resource — что вводит значение в эту переменную?

2. Извините, я не до конца понял это. Я использую github.com/hasanen/MovieLibrary/blob/master/movielibrary-core / … в основе всех интеграционных тестов. Итак, если я правильно понял ваш вопрос, ответ — spring? 😀

Ответ №1:

Судя по тому, как вы объясняете проблему, проблема, похоже, в классе setUp. Класс setUp запускается перед каждым вызовом тестового примера. Это общая последовательность.

1- Добавьте три фильма.

2- Проверьте, существует ли три фильма.

3- Добавить три фильма

4- удалите элемент фильма # 1.

Поскольку последовательность 1-4 работает, проблема заключается в последовательности 3. Либо последовательность 3 проглатывает какое-либо исключение, либо изменяет базовый объект. (возможно, изменяется последовательность.) Не зная, как addMovie изменяет базовый объект, трудно сказать.

Комментарии:

1. Спасибо, я решаю проблему. Я не учел, что при втором тестировании идентификаторы жанров не были 0,1,3, как это было в первом тесте. Итак, я создал новый метод, который выдает мне жанр по названию, поэтому мне не нужно жестко кодировать идентификатор при тестировании удаления.

2. Это может решить проблему в данном случае, но это не лучшая тактика. Смотрите мой ответ.

3. Я согласен с @Don .. Пожалуйста, создайте новый экземпляр в методе установки.

Ответ №2:

Создается что-то за пределами вашего тестового класса (вероятно, суперкласс) movieLibraryService , и оно не воссоздается так часто, как это необходимо для независимого тестирования.

Если вы добавите строку

 movieLibraryService = new MovieLibraryService();
  

в верхней части вашего testSetUp() метода эта служба будет должным образом сброшена перед запуском каждого метода тестирования, и они, вероятно, будут работать должным образом.

Как бы то ни было, я подозреваю, что вы получаете сбой в утверждениях о размере, поскольку размер становится 6 вместо 3.

В качестве альтернативы, вы могли бы добавить метод teardown (с пометкой @After ), который удаляет содержимое библиотеки фильмов, чтобы она всегда начиналась пустой.

Ответ №3:

ИМХО, проблема в том, что ваш тест — это не настоящий модульный тест, а интеграционный. Итак, при тестировании вашего сервиса вы тестируете все уровни, которые он использует. Я рекомендую вам использовать mocks для зависимостей более низких уровней (EasyMock или что-то в этом роде) и использовать интеграционные тесты только для вашего уровня репозитория. Таким образом, вы можете избежать влияния уровня сохраняемости при тестировании уровня сервиса.