мета-замена одного и того же метода в двух разных тестах не работает? - PullRequest
0 голосов
/ 04 апреля 2019

Тестовый контроллер выглядит следующим образом

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)

}

Один тест не пройден.Когда я использовал отладчик, я заметил, что эта замена не работает

PaymentService.metaClass.justTest = {['status': true]}

Так что мне интересно, почему одна мета замена работает, а другая не работает?Разве невозможно изменить один и тот же метод в двух разных тестовых примерах с использованием метапрограммирования?Я ценю любую помощь.Спасибо!

1 Ответ

0 голосов
/ 04 апреля 2019

Я бы выбрал другой подход:

void test1(){
    controller.paymentService = new PaymentService() {
        def justTest() {['status': true]}
    }

    def res = controller.justTest()
    assertEquals(res.status, true)
}

Или, если вы использовали Спок вместо JUnit:

void test1() {
    controller.parymentService = Stub() {
         justTest() >> [status: true]
    }
    // ...  other code
}
...