当前位置: 首页 > 知识库问答 >
问题:

单元测试void方法:验证参数

唐啸
2023-03-14

我正在为我的程序创建一个单元测试。我有一个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)

   }

值显示为空。有什么想法吗?

共有1个答案

郤浩慨
2023-03-14

你可以嘲笑你的服务。

这是一个非常简单的脚本,它模拟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方法带了两个文件对象(或者是两个资源对象)和断言,一行一行的,两个文件有相同的上下文。因此,它可能创建了一个文件,有预期的输出和对比之后返回的真实结果: