Java 如何使用EasyMock测试内部类
我是EasyMock的新手。我需要使用EasyMock测试我的类,但这里的问题是我的类有内部类,而这个内部类是在外部类的方法中建立的,并通过传递一些参数来调用内部类的方法。我不知道如何测试这门课 下面是一些示例代码Java 如何使用EasyMock测试内部类,java,unit-testing,easymock,Java,Unit Testing,Easymock,我是EasyMock的新手。我需要使用EasyMock测试我的类,但这里的问题是我的类有内部类,而这个内部类是在外部类的方法中建立的,并通过传递一些参数来调用内部类的方法。我不知道如何测试这门课 下面是一些示例代码 Any help or suggetions are highly appreciated. public class ServiceClass implements ServiceInterface { public void updateUSer(USer) {
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..
}
}
有些东西不能用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一样在构造函数中作为参数传递。但我认为,如果它很复杂,必须是模拟代码,那么它可能不是一个内部类
此外,您还可以使用,它允许您模拟静态调用和构造函数调用,以防您不介意更改测试框架
希望能有帮助。
问候