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