元替换两个不同的测试中的相同方法不起作用?

时间:2019-04-04 05:20:57

标签: grails groovy integration-testing metaprogramming 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)

}

一个测试失败。当我使用调试器时,我注意到这种替换无法正常工作

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

因此,我想知道为什么一个元替换有效,而另一个则无效?使用元编程无法在两个不同的测试案例中更改相同的方法吗?感谢您的帮助。谢谢!

1 个答案:

答案 0 :(得分:0)

我会采用另一种方法:

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
}