我正在为我的程序创建一个单元测试。我有一个void方法,它接受五个参数,然后将这些参数转换成一个闭包,并将其传递给另一个服务,然后将其转换成电子邮件并发送。我唯一关心的是这封邮件的正文,它存储在传递给这个函数的一个参数中。有没有可能在不改变我的程序设计的情况下验证这个论点?
Class myTestService
{
def outsideService
private void sendEmail (User source, String subj, String body, List to, List attachments){
outsideService.sendMail{
//blah blah
subject subj
html wrapWithDefault(body) //wrapWithDefault is a big styling document also in this function
//blah blah
}
}
int send(GrailsParameterMap params, HttpServletRequest request) {
//Parse out attachments from request and body/subject/addressee from params
//little bit of business logic to ensure that we can send emails in our system
sendEmail(source,
subject,
"$body <br /><br /> important extra information",
sendTo,
attachments)
//Send another email to the source as a receipt
sendEmail(source,
subject,
"$body extra junk $receiptBody",
source,
attachments)
}
编辑:作为对下面答案的回应,我在测试中插入了一个spock样式的模拟,但我认为我的语义不对,因为value存储的是NULL。void“#value contains#params.body”(){givided:
//def params, request, filling in all necessary values
def value
def mailServiceMock = Mock(MailService)
mailServiceMock.sendMail(*_) >> {closure ->
closure.delegate = new Expando(
multipart:{},
from: {},
subject: {},
html: {value = it}
bcc: {}
)
closure()
}
//inform service of mock
service.mailService = mailServiceMock
when:
service.send(params, request)
then:
println("value = $value")
1 * mailServiceMock.sendMail(*_) // this should fail, since this should be called twice, but one thing at a time.
value.contains(params.body)
}
值显示为空。有什么想法吗?
你可以嘲笑你的服务。
这是一个非常简单的脚本,它模拟OutsideService
将在HTML
方法中接收的值存储在脚本var中。您应该使用Spock/JUnit/Younameit来使其整洁。
class MyTestService
{
def outsideService
private void sendEmail (source, String subj, String body, List to, List attachments){
outsideService.sendMail{
subject subj
html "<body>$body</body>"
}
}
}
myTest = new MyTestService()
def body
myTest.outsideService = [sendMail: { closure ->
closure.delegate = new Expando(
subject: { }, //don't care
html: { body = it }
)
closure()
}]
myTest.sendEmail(null, 'my subject', 'my email body', null, null)
assert '<body>my email body</body>' == body
问题内容: 我有一个充满void方法的Java类,我想进行一些单元测试以获得最大的代码覆盖率。 例如我有这种方法: 它的名字不好用是因为我翻译了代码以更好地理解。每种方法均会验证参数是否在某种程度上有效并且编写正确。 范例: 我的单元测试很好地涵盖了小的方法,因为我要求它们检查ErrorFile是否包含错误消息,但是我看不到如何测试方法checkIfValidElements,它什么也不返回或什么
我陷入了单元测试场景的一个基本问题,并将感谢帮助。 我有一个类,它调用在DB中将标志设置为true。 我的测试: 我被要求测试并检查是否正在使用相关数据调用。 由于返回类型无效,我如何测试它?
Java 8,但这是一个通用的单元测试问题,它(很可能)是与语言无关的。 编写JUnit测试的语法很容易,但是决定要编写什么测试以及如何测试主/生产代码是我发现的最大挑战。在阅读单元测试最佳实践时,我一遍又一遍地听到同样的事情: 测试合同 我相信这个想法是,单元测试不应该是脆弱的,如果方法的实现发生变化,它不应该被破坏。该方法应定义输入的协定 - 假设我有以下方法: 所以在这里,我们有一个方法,我
玩弄Mockito来实现我的服务的单元测试,但由于某种原因,我无法通过我的厚脑袋来实现这一点。我的考试通过了,但我不能确信我做得对。 下面是一个测试count()方法的示例。该方法只是将调用转发到它的存储库,我不想验证仅此而已,没有其他事情发生。这就是我得到的: 我的考试及格了,但我有一些问题。 > 我需要验证吗?我觉得我这样做是因为我想验证personRepository。实际上调用了count
当一个批处理任务写入数据库的时候,很容易去查询数据去验证结果是否如预期一样。然而,如果批处理任务写入一个文件,验证输出量同样重要。Spring Batch 提供了一个类AssertFile使输出文件的验证变得容易。assertFileEquals方法带了两个文件对象(或者是两个资源对象)和断言,一行一行的,两个文件有相同的上下文。因此,它可能创建了一个文件,有预期的输出和对比之后返回的真实结果: