我是EasyMock的新手。我需要使用EasyMock测试我的类,但问题是我的类有内部类,这个内部类在外部类的方法中实例化,并通过传递一些参数来调用内部类的方法。我不确定如何测试这门课程。
以下是一些示例代码。
Any help or suggetions are highly appreciated.
public class ServiceClass implements ServiceInterface {
public void updateUSer(USer) {
//some logic over here.
sendEmailNotice(subject, vTemplate);
}
private sendEmailNotice(subject, vTemplate) {
MimeMessagePrepator eNotice = new PrepareEmailNotice(subject, vTemplate);
MailSender.send( eNotice );
}
public class PrepareEmailNotice implements MimeMessagePrepator {
// some local variables.
public PrepareEmailNotice(subject, vTemplate) {
subject = subject;
vTemplate = vTemplate;
}
public void prepare( MimeMessage message) {
MimeMessageHealper helper = new MimeMessageHealper(message, true);
// setting the mail properties like subject, to address, etc..
}
}
答案 0 :(得分:2)
有些东西你无法用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,它允许您模拟静态调用和构造函数调用,以防您不介意更改测试框架。
希望它有所帮助。 问候。