#grails #groovy #integration-testing #metaprogramming #grails-2.2
#grails #заводной #интеграция-тестирование #метапрограммирование #grails-2.2
Вопрос:
Тестовый контроллер выглядит следующим образом
def justTest(){
def res = paymentService.justTest()
[status: res.status]
}
Метод тестовой службы заключается в следующем
def justTest(){
}
Теперь два тестовых примера выглядят следующим образом. Метод платежной службы justTest был изменен в обоих случаях, чтобы возвращать два разных значения.
@Test
void test1(){
PaymentService.metaClass.justTest = {['status': true]}
def res = controller.justTest()
assertEquals(res.status, true)
GroovySystem.metaClassRegistry.removeMetaClass(PaymentService.class)
}
Второй тест заключается в следующем
@Test
void test2(){
PaymentService.metaClass.justTest = {['status': false]}
def res = controller.justTest()
assertEquals(res.status, false)
GroovySystem.metaClassRegistry.removeMetaClass(PaymentService.class)
}
Один тест не выполняется. Когда я использовал debugger, я заметил, что эта замена не работает
PaymentService.metaClass.justTest = {['status': true]}
Итак, мне интересно, почему одна мета-замена работает, а другая не работает? Разве невозможно изменить один и тот же метод в двух разных тестовых примерах с помощью метапрограммирования? Я ценю любую помощь. Спасибо!
Комментарии:
1. Я не использовал JUnit, но я бы предложил издеваться
PaymentService
вместо использованияmetaClass
. Кроме того, попробуйте переместить следующую строку в качестве первой строки тестаGroovySystem.metaClassRegistry.removeMetaClass(PaymentService.class)
Ответ №1:
Я бы выбрал другой подход:
void test1(){
controller.paymentService = new PaymentService() {
def justTest() {['status': true]}
}
def res = controller.justTest()
assertEquals(res.status, true)
}
Или если бы вы использовали Spock вместо JUnit:
void test1() {
controller.parymentService = Stub() {
justTest() >> [status: true]
}
// ... other code
}