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

标签 grails groovy integration-testing metaprogramming grails-2.2

测试 Controller 如下

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

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

最佳答案

我会采取另一种方法:

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
}

关于grails - 元替换两个不同的测试中的相同方法不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55508397/

相关文章:

python - 使用nose分别运行单元和集成测试(位于不同的目录中)

java - Java 集成测试中的 void 方法

grails - 将值传递给另一个 Controller 功能时出错

java - Grails 是大型企业 Web 应用程序的可行选择吗?

使用闭包和 null 安全检查进行 Groovy 集合排序会导致异常

elasticsearch - Kibana脚本字段中的Groovy脚本

elasticsearch - 用于测试环境的Elasticsearch配置

Grails - 通过考虑时区的用户显示日期

Grails 查询不在列表中

gradle - Jacoco Gradle 中的最低代码覆盖率阈值