我有一个似乎未通过的单元测试。 :(
{
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/