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()
答案 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