gpt4 book ai didi

java - 如何使用 EasyMock 测试内部类

转载 作者:行者123 更新时间:2023-11-30 04:59:12 32 4
gpt4 key购买 nike

我是 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..
}
}

最佳答案

有些事情你无法使用 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 ,如果您不介意更改测试框架,它允许您模拟静态调用和构造函数调用。

希望有帮助。问候。

关于java - 如何使用 EasyMock 测试内部类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7510453/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com