Grails单元测试中的存根方法
Stub method in grails unit test
我有一个单元测试似乎没有通过。 :(
{
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
}
错误似乎总是 "No exception was thrown"。如果 details
的值不为空,方法 validatePaymentDetails
应该抛出异常。
感谢您的帮助!
提供这样的服务:
class PaymentService {
void validatePaymentDetails(long paymentMethodId, BigDecimal amount) {
if(PaymentDetails.findByIdAndAmountAndDateCreatedGreaterThanEquals(paymentMethodId, amount, new Date()) != null) {
throw new InvalidOperationException()
}
}
}
确保 InvalidOperationException
在 PaymentDetails.findByIdAndAmountAndDateCreatedGreaterThanEquals
returns 不同于 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
}
}
希望对您有所帮助。
我有一个单元测试似乎没有通过。 :(
{
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
}
错误似乎总是 "No exception was thrown"。如果 details
的值不为空,方法 validatePaymentDetails
应该抛出异常。
感谢您的帮助!
提供这样的服务:
class PaymentService {
void validatePaymentDetails(long paymentMethodId, BigDecimal amount) {
if(PaymentDetails.findByIdAndAmountAndDateCreatedGreaterThanEquals(paymentMethodId, amount, new Date()) != null) {
throw new InvalidOperationException()
}
}
}
确保 InvalidOperationException
在 PaymentDetails.findByIdAndAmountAndDateCreatedGreaterThanEquals
returns 不同于 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
}
}
希望对您有所帮助。