我如何编写一些测试,以便他们在测试时不发送电子邮件?

时间:2016-07-23 18:04:52

标签: java email google-app-engine testing automated-tests

我正在向表格提交的用户发送电子邮件。我在测试时遇到问题。我正在测试sendConfirmationEmailForSubmission,并提交表单。但是在测试表单提交时,它每次都会发送邮件。我有很多组合来测试表单提交。我正在通过在提交测试时发送电子邮件来浪费我的电子邮件配额,因为我正在分别测试sendEmail功能。任何人都可以帮助我。

SubmitAction提交表单并发送电子邮件。发送电子邮件submitAction来电sendConfirmationEmailForSubmission()

public void sendConfirmationEmailForSubmission(String userId)
    throws EntityDoesNotExistException {

Assumption.assertFalse(ERROR_NULL_PARAMETER, userId == null );

EmailsLogic.sendConfirmationEmailForSubmission(userId);
}

我认为不是使用上面的函数我应该像这样使用它并在测试表单submssion时传递userId = null?

public void sendConfirmationEmailForSubmission(String userId)
    throws EntityDoesNotExistException {

if (userId != null ) {
    EmailsLogic.sendConfirmationEmailForSubmission(userId);
    }
}

2 个答案:

答案 0 :(得分:0)

您发送电子邮件(EmailsLogic.sendConfirmationEmailForSubmission)的方法似乎是静态的。

您可以使用PowerMock之类的库来模拟电子邮件服务。在模拟方法中,您只需打印“已发送电子邮件”,而无需实际发送电子邮件并测试其余代码。

这是一篇关于使用PowerMock测试静态方法的好文章: https://blog.codecentric.de/en/2011/11/testing-and-mocking-of-static-methods-in-java/

答案 1 :(得分:0)

不应该在Java中滥用静态方法。 为了满足您的需求,我建议您利用OOP:多态性。 这将使您的设计更灵活,更可测试。

因此,您可以在实例方法中更改静态方法EmailsLogic.sendConfirmationEmailForSubmission。 然后,您可以使用EmailsLogic类层次结构的对象,而不是依赖静态方法。 您可以创建两个EmailsLogic实现。 EmailsLogic发送了真正的邮件,另一个类StubbedEmailsLogic扩展了EmailsLogic类,但通过不发送邮件来覆盖电子邮件发送方法sendConfirmationEmailForSubmission()。 现在,在您的测试中,使用StubbedEmailsLogic实例,通过将此实例提供给SubmitAction类来伪造邮件发送。
重要提示:您的操作类应该期望基类型EmailsLogic,以便能够切换到一个或其他实现。