Первый вопрос касается кода, который он пишет для тестирования. Что это за насмешка? Вам не нужно использовать @Mock для насмешки над объектом?
Чтобы смоделировать объект, вы должны предоставить объект того же типа, т.е. он ведет себя одинаково или является подтипом класса, объект которого вы хотите смоделировать. Таким образом, для макетирования объекта вы можете использовать экземпляр анонимного класса (в вашем случае это будет объект анонимного класса с расширением MyDIApplication
) или вы можете использовать Mockito с его аннотацией @Mock
, которая в основном похожа на вещь. В основном использование @Mock
аннотации похоже на выполнение:
MyDIApplication myDiApplication = Mockito.mock(MyDIApplication.class)
, который создает фиктивный объект, расширяющий класс, переданный в конструктор. Здесь вы можете передать интерфейс или класс в зависимости от того, что вы хотите макетировать.
При использовании анонимного класса вы предоставляете реализацию методов, которые вы хотите смоделировать в переопределенных реализациях методов, но в случае Mockito вы предоставляете поведение с намерениями, используя такие методы, как Mockito::when
.
И второй вопрос - о тестировании приложения без внедрения зависимостей. Я не понимаю, почему он говорит: «Тестирование приложения будет очень трудным, поскольку наше приложение напрямую создает экземпляр службы электронной почты. Мы не можем высмеивать эти объекты в наших тестовых классах». Почему мы не можем высмеивать эти объекты в наших тестах.
Полагаю, вы ссылаетесь на этот код:
public class MyApplication {
private EmailService email = new EmailService();
public void processMessages(String msg, String rec){
//do some msg validation, manipulation logic etc
this.email.sendEmail(msg, rec);
}
}
Здесь вы создаете экземпляр EmailService
как поле класса. Таким образом, вы не можете высмеивать это (хотя вы можете использовать отражение или PowerMock). Таким образом, вы тесно связаны с EmailService
, и трудно проверить логику класса MyApplication
. Чтобы проверить это, вы можете использовать конструктор инъекций:
public class MyApplication {
private EmailService email;
public MyApplication(EmailService emaliService) {
this.email = emailService;
}
public void processMessages(String msg, String rec){
//do some msg validation, manipulation logic etc
this.email.sendEmail(msg, rec);
}
}
или впрыск сеттера:
public class MyApplication {
private EmailService email;
public void setEmailService(EmailService emailService) {
this.email = emailService;
}
public void processMessages(String msg, String rec){
//do some msg validation, manipulation logic etc
this.email.sendEmail(msg, rec);
}
}