grails单元测试中的存根方法

问题描述 投票:0回答:1

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

{
    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应该引发异常。

谢谢您的帮助!

java unit-testing grails groovy
1个回答
0
投票

提供这样的服务:

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
    }
}

我希望有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.