【问题标题】:Recursive method not working properly in grails/groovy unit test case递归方法在 grails/groovy 单元测试用例中无法正常工作
【发布时间】:2013-04-26 15:34:54
【问题描述】:

MyService.class

public boolean myMethod1() {
    boolean success = false
    for (1..2) {
        success = myMethod2()
    }
    return success
}

public boolean myMethod2() {
    int value = otherService.someMethod() // mocked this method call
    boolean saved = false
    try {
        // trying to persist value
    } catch (ValidationException e) {
        if (someCondition)
            myMethod2() // comes back here instead of going to the method called :  "Problem line"
    }
    return saved
}

我有一个测试用例,它模拟了otherService.someMethod(),每次执行都会返回不同的结果。 使用 groovy 方式而不是 grails Grails 错误 - http://jira.grails.org/browse/GRAILS-4611

当出现验证异常并且在某些情况下,我想递归调用myMethod2() 以获取用于保存数据的新输出。 模拟方法闭包将以这样的方式返回输出,即第一遍将返回 int,它将在内部返回 (true/false) 到 myMethod1()。 下一次(从循环中)调用otherService.someMethod() 时,它将返回一个输出,这将导致validationException 和 它将为新输出调用相同的方法。现在,当第三次调用模拟方法时,被模拟的 输出将返回一个不会导致验证异常的不同值。执行 try 块后, 它涉及到myMethod2() 的返回语句,但它返回到“问题行”而不是返回到调用它的myMethod1()

如何让测试用例回调myMethod1()

【问题讨论】:

    标签: grails recursion groovy testcase


    【解决方案1】:

    这样想,我在火车上旅行,我从座位上站起来,通过互连从一个车厢走到另一个车厢,然后又走到另一个车厢。所以现在我在火车的第四节车厢。如果我想回到第一个隔间的座位,我必须从第四个到第三个到第二个到第一个,因为我不能直接从第四个隔间跳到第一个隔间(除非我是绿巨人或铁男人和在火车的顶部)。类似的概念适用于方法调用。

    method1() 打电话给method2() 打电话给method2() 打电话给method2()

    return 来自最后一个方法的值时,控件应该以相反的顺序回溯。因此,为了返回method1(),您必须检查成功条件以返回给调用者,如下所示:

    public boolean myMethod2() {
    
        int value = otherService.someMethod() // mocked this method call
        boolean saved = false
        try {
            // trying to persist value
        } catch (ValidationException e) {
            if (someCondition){
                myMethod2() // comes back here instead of going to the method called :  "Problem line"
                if(some value satisfied){
                     return // return to caller with true or false or whatever according to your need
                 }
            }
        }
        return saved
    }
    

    【讨论】:

    • 感谢您的意见。我修改了我的代码,并在下面给出了答案。
    【解决方案2】:

    我认为当 return saved 被调用时,它会转到调用它的父 api。但根据堆栈(线程),它转到:Problem Line

    我所做的是,在 catch 块中,而不是只调用 myMethod2() 我将其修改为 return myMethod2()

    根据业务逻辑最终返回true/false。并且测试用例也通过了。

    感谢您的意见 dmahapatro

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-16
      • 2022-01-19
      • 1970-01-01
      • 2015-11-11
      • 1970-01-01
      • 1970-01-01
      • 2020-08-29
      相关资源
      最近更新 更多