Есть некоторые вещи, которые нельзя смоделировать с Easymock как вызовы статических методов и вызовы конструкторов. Вы можете изменить свой код, чтобы иметь возможность тестировать его с Easymock, потому что в методе sendEmailNotice есть вызов, который вы можете посмеяться, но не можете. Было бы уместно использовать макет для вызова MailSender.send (). Мы могли бы сделать это, создав класс, содержащий вызов MailSender, который можно было бы смоделировать.
public class MailWrapper {
public MailWrapper () {
}
public void send ( MimeMessagePrepator eNotice) {
MailSender.send(eNotice);
}
}
Вы можете использовать экземпляр этого класса для использования в вашем ServiceClass.
public class ServiceClass implements ServiceInterface {
//Added as a member
private MailWrapper mw;
public ServiceClass () {
this.mw = new MailWrapper();
}
//Constructor added for test purposes
public ServiceClass (MailWrapper mw) {
this.mw = mw;
}
public void updateUSer(USer) {
//some logic over here.
sendEmailNotice(subject, vTemplate);
}
private sendEmailNotice(subject, vTemplate) {
MimeMessagePrepator eNotice = new PrepareEmailNotice(subject, vTemplate);
mw.send( prepator );
}
...
}
Тест класса ServiceClass будет выглядеть так:
public class ServiceClassTest {
@Test
public void testUpdateUser() {
String subject = "Expected subject";
String vTemplate = "Expected vTemplate";
MimeMessagePrepator eNotice = new PrepareEmailNotice(subject,vTemplate);
MailWrapper mwMock = createMock (MailWrapper.class);
//expecting the void call to the MailWrapper
mwMock.send(eNotice);
//other expectations...
replay(mwMock);
ServiceClass sc = new ServiceClass(mwMock);
sc.updateUser(new User());
verify(mwMock);
//some asserts
}
}
В сообщении, которое вы спрашивали о внутреннем классе, но я думаю, что тест внутреннего класса содержится в тесте внешнего класса, и вы бы
не нужно тестировать его отдельно. В случае, если PrepareEmailNotice имеет сложный код и должен быть смоделирован, вы можете внести изменения, добавив член MimeMessagePrepator, который
может быть передан в качестве параметра в конструкторе, как MailWrapper. Но я думаю, что в случае, если он имеет сложный код, который должен быть смоделирован, возможно, это не будет внутренний класс.
Кроме того, вы можете использовать Powermock , который позволяет имитировать статические вызовы и вызовы конструктора на случай, если вы не против изменить свою тестовую среду.
Надеюсь, это поможет.
Привет.