如何在 Grails 单元测试中断言服务消息异常的内容

How to assert the content of a service message exception in a Grails unit test

我正在使用 Grails 4.0.3 并想断言在给定情况下会抛出异常。下面,我的 PidService。

def validatePidIssuingConclusionDocument(JSONObject pidIssuingConclusionDocument){
        String message = "Document issuing number is mandatory"
        if(!pidIssuingConclusionDocument.has("docIssuingNumber")){throw new Exception(message)}
}

下面是我的测试用例:

void "wrong document"() throws Exception {
        JSONObject documentWithoutIssuingNumber = new JSONObject()
        documentWithoutIssuingNumber.accumulate("docIssuingNumber","123")
        pidService.buildPidIssuingOrder(documentWithoutIssuingNumber) 
        // How can I assert that the exception is thrown and verify it message.
}

我尝试在测试用例中使用 try/catch 但没有成功。谁能帮帮我?我需要断言异常被抛出并且消息是 Document issuing number is mandatory in the given case.

I need to assert that the exception is thrown and the message is Document issuing number is mandatory in the given case.

我无法围绕您提供的代码提供可执行示例,因为缺少某些内容(例如 buildPidIssuingOrder)。请参阅位于 https://github.com/jeffbrown/dnunesexception 的项目,其中包含一个示例,该示例展示了一种在测试中处理异常的方法。

grails-app/services/dnunesexception/PidService.groovy

package dnunesexception

import org.grails.web.json.JSONObject

class PidService {
    def buildPidIssuingOrder(JSONObject pidIssuingConclusionDocument) {
            throw new Exception('Document issuing number is mandatory')
    }
}

src/test/groovy/dnunesexception/PidServiceSpec.groovy

package dnunesexception

import grails.testing.services.ServiceUnitTest
import spock.lang.Specification
import org.grails.web.json.JSONObject

class PidServiceSpec extends Specification implements ServiceUnitTest<PidService>{

    void "test something"() {
        when:
        JSONObject documentWithoutIssuingNumber = new JSONObject()
        documentWithoutIssuingNumber.accumulate("docIssuingNumber","123")
        service.buildPidIssuingOrder(documentWithoutIssuingNumber)

        then:
        def e = thrown(Exception)

        and:
        e.message == 'Document issuing number is mandatory'

    }
}