0

我的服务类

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()调用时,它将返回一个输出,这将导致 avalidationException并且它将为新输出调用相同的方法。现在,当第三次调用模拟方法时,模拟输出将返回一个不同的值,不会导致验证异常。执行 try 块后,它会返回 的 return 语句,myMethod2()但它会回到“问题行”而不是回到myMethod1()调用它的那个。

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

4

2 回答 2

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
}
于 2013-04-26T18:56:31.713 回答
0

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

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

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

感谢您的输入 dmahapatro

于 2013-04-26T23:54:10.493 回答