java - Grails单元测试中的 stub 方法

标签 java unit-testing grails groovy

我有一个似乎未通过的单元测试。 :(

{
    given:
    Date currentDate = new Date()
    DateUtils.getCurrentDate() >> currentDate
    BigDecimal amount = 5
    long paymentMethodId = 4L
    Date fiveMinutesBeforeCurrentDate = new Date()

    use (TimeCategory) {
        fiveMinutesBeforeCurrentDate = currentDate-5.minutes
    }

    PaymentDetails details = Mock(PaymentDetails)
    PaymentDetails.findByIdAndAmountAndDateCreatedGreaterThanEquals(paymentMethodId, amount, fiveMinutesBeforeCurrentDate) >> details

    when:
    service.validatePaymentDetails(paymentMethodId, amount)

    then:
    thrown InvalidOperationException
}

该错误始终显示为“未引发异常”。如果validatePaymentDetails的值不为null,则details方法应引发异常。

谢谢您的帮助!

最佳答案

给定这样的服务:

class PaymentService {

    void validatePaymentDetails(long paymentMethodId, BigDecimal amount) {
        if(PaymentDetails.findByIdAndAmountAndDateCreatedGreaterThanEquals(paymentMethodId, amount, new Date()) != null) {
            throw new InvalidOperationException()
        }
    }
}

可以确保在InvalidOperationException返回除PaymentDetails.findByIdAndAmountAndDateCreatedGreaterThanEquals以外的任何内容时都抛出null的单元测试如下所示:
import grails.testing.gorm.DataTest
import grails.testing.services.ServiceUnitTest
import spock.lang.Specification

class PaymentServiceSpec extends Specification implements ServiceUnitTest<PaymentService>, DataTest{

    @Override
    Class[] getDomainClassesToMock() {
        [PaymentDetails]
    }

    void "test payment details validation"() {
        given:
        BigDecimal amount = 5
        long paymentMethodId = 4L

        GroovySpy(PaymentDetails, global: true)

        def details = new PaymentDetails()
        1 * PaymentDetails.findByIdAndAmountAndDateCreatedGreaterThanEquals(_, _, _) >> details

        when:
        service.validatePaymentDetails(paymentMethodId, amount)

        then:
        thrown InvalidOperationException
    }
}

希望对您有所帮助。

关于java - Grails单元测试中的 stub 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61871552/

相关文章:

java - 为什么当我开始此操作时我的框架会卡住[下载]

java - 即使使用迭代器也会出现 ConcurrentModificationException

grails - Bcrypt密码编码器-Grails

grails 和调试 UrlMappings

java - 如何在 JSONArray 中存储唯一元素

java - 什么时候安装 Guice 模块?

python - 在类方法中模拟函数

python - 如何正确运行查询 Flask-SQLAlchemy 数据库的连续测试?

reactjs - 使用 Jest 和 Enzyme 调用函数

grails - 使用 Assets 管道和 Bootstrap 在Grails 3.1.11中进行类强制转换生成WAR文件