не работает мета-замена одного и того же метода в двух разных тестах?

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