#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 или что-то в этом роде) и использовать интеграционные тесты только для вашего уровня репозитория. Таким образом, вы можете избежать влияния уровня сохраняемости при тестировании уровня сервиса.