2015-09-26 52 views
0

我有一个方法是这样的:关闭验证覆盖默认嘲讽

public void save(DbSession session,Wrappe wrapper,Wrappe wrappe){ 
     //...other logic 

     //save wrapper 
     wrapper=(Wrapper)session.save(wrapper) 

     //set wrapper's id into wrappee 
     wrappee.setWrapperId(wrapper.getId()); 

     //save wrappee 
     session.save(wrappee); 
} 

和测试代码如下所示:

given:  
    session.save(_) >> wrapperWithGeneratedId 

    when: 
    obj.save(session,wrapper,wrappee) 

    then:"wrapper got saved" 
    1*session.save(_) >> {Wrapper save -> 
     diffs(wrapper,saved)==null 
    } 
    and:"wrappee" 
    1*session.save(_) >> {Wrappe saved -> 
     diffs(wrappee,saved)==null 
    } 

这些测试代码会给出一个例外:

java.lang.ClassCastException: java.lang.Boolean cannot be cast to com.company.model.Wrapper 

如果在“然后”部分评论验证关闭,测试将通过,所以我猜这部分

1*session.save(_) >> {Wrapper save -> 
     diffs(wrapper,saved)==null 
} 

凌驾于这个嘲弄:

session.save(_) >> wrapperWithGeneratedId 

任何方法都做正确?

回答

0

1st。 '和'是句法糖。这只是一种在同一个块中直观地分离代码的方法。你的最后两个嘲笑实际上是相同的(虽然因为你正在行为测试,它仍然会验证保存被称为两次。)

2nd。假设你想验证diffs(wrapper,saved)==null,那目前不会发生,因为它不是“基础级”评估。如果你想评估它,那么任何内部/关闭/等等都需要用“assert”作为前缀。

3rd。一个块的范围是它的when块,并且可以覆盖现有的mock;你假设你的模拟被覆盖是正确的。

4th。您是否有任何理由不仅仅将您的回报价值包括在评估中?

2 * session.save(_) >> {Wrapper save -> 
    diffs(wrapper,saved)==null 
    return wrapperWithGeneratedId 
} 

5th。你的错误是由于你的模拟返回了一个布尔值(你的断言逻辑),然后Groovy尝试(并失败)解析为包装器。我为什么发生这种情况的假设是.save()具有返回类型的包装器。为了解决这个问题,你要么需要创建一个包装布尔构造函数,或者改变你的模拟到Groovy的东西可以变成一个包装返回(如何做第4点)

Official Stub/Mock/Spy documentation (quite good, worth a read)