#java #unit-testing #junit #mocking #mockito
Вопрос:
public String getMongoDBName() throws Exception {
return mongoConnectionDetails.getMongoDatabase().getName();
}
Пользовательский класс Mongoconnectiondetail автоматически подключается здесь.
То, что я пытался, это
Mock (mongoDboperation);
when(mongoConnectionDetails.getMongoDatabase().getName()).thenReturn("dbName");
String output = mongoDboperation.getMongoDBName();
assertEquals (output, "actualDBname");
Но гидролокатор все еще показывает это в виде красных незакрытых линий. Пожалуйста, помогите. Спасибо!
Комментарии:
1. если вы издеваетесь над mongoDboperation, это не может быть ожидаемым результатом
2. Методы модульного тестирования «геттер» имеют очень высокое соотношение затрат и выгод. Потратьте свое время на что-нибудь другое.
Ответ №1:
Вы не получаете покрытия для этого метода, потому что вы запускаете тест с макетом объекта. Это означает, что вы тестируете только макет, а не исходный класс.
В общем, в тестах для определенного класса вы никогда не должны издеваться над тестируемым классом. Только издеваются над сотрудниками этого класса (в данном случае, mongoConnectionDetails
.
Комментарии:
1. Так что это класс ДАО. Вы имеете в виду , что я должен создать объект DAO с новой или автоматической проводкой, а затем имитировать зависимости, верно ?
2. Да, именно это я и имел в виду, но я бы также согласился с комментарием Дауда ибн Карима выше о том, что модульное тестирование DAO с помощью насмешек не так уж полезно. Описанный выше метод на самом деле не имеет никакой логики или вычислений для тестирования, поэтому тестирование с помощью макета проверяет только то, что он вызывает метод, который он явно вызывает в исходном коде. Это не доказывает, что это действительно работает. Было бы более полезно получить покрытие для этого с помощью интеграционных тестов, которые используют реальную базу данных.