递归方法在grails / groovy单元测试用例中无法正常工作

时间:2013-04-26 15:34:55

标签: grails recursion groovy testcase

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 bug - http://jira.grails.org/browse/GRAILS-4611

当存在验证异常并且在某些条件下,我想递归调用myMethod2()以获取用于保存数据的新输出。 mocked方法闭包将返回一个输出,使得第一个pass将返回int,它将在内部返回(true / false)回myMethod1()。 调用otherService.someMethod()的下一个(从循环开始)时间将返回一个输出,该输出将导致validationException和 它将为新输出调用相同的方法。现在当第三次调用mocked方法时,被模拟了 输出将返回不同的值,不会导致validationException。执行try block后, 它涉及myMethod2()的返回声明,但它可以追溯到"问题行"而不是回到调用它的那个myMethod1()

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

2 个答案:

答案 0 :(得分:1)

这样想,我乘火车旅行,我从座位上站起来,通过互连从另一个隔间走到另一个隔间,另一个隔间走到另一个隔间。所以现在我在火车的第四个车厢。如果我想回到我在第一个隔间的座位,我必须一直走到第4到第3到第2到第1个因为我不能直接从第4个隔间跳到第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
}

答案 1 :(得分:0)

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

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

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

感谢您输入dmahapatro