我有一个对象列表。我想知道是否有一些对象方法被调用。
即:
List<Object> list = ...;
Object first = spy(new Object());
Object second = spy(new Object());
list.add(first);
list.add(second);
callToStringToOnlyOneRandomElement(list);
我想知道如何进行验证部分。如果发生这种情况,测试就可以了:
verify(first, times(1)).toString();
verify(second, never()).toString();
如果发生这种情况的XOR:
verify(first, never()).toString();
verify(second, times(1)).toString();
但在其他情况下(如果first.toString()
和second.toString()
被调用则没有,
或两者都没有被召唤。)
对于上下文:真正的问题涉及线程和竞争条件。我想知道是否直接处理了10个元素,以及所有其他元素是否都进入了私有队列。因为调用是同时发生的,所以没有直接处理数组元素的顺序(这是预期的行为)。
目前,我正在使用Mockito 1.9
答案 0 :(得分:1)
我不确定Mock库可以为您提供开箱即用的帮助。我宁愿编写我的模拟对象来验证这一点,也可以按照Andriy Simonov的建议(添加一个元素两次并检查该方法只调用一次)
总而言之,竞争条件是单位/自动测试最糟糕的事情之一,所以最好将它们设计出来。 当您测试竞争条件时,您创建的测试可能会随机传递和失败(如果通过它并不是100%意味着您的功能正常工作,这也可能意味着由于某些随机的竞争条件,您试图测试刚刚没有发生。)
答案 1 :(得分:1)
通常,线程的行为不应该是单元测试的主题。 结果可能会有很大差异,集成测试套件更适合这种情况。
如果你真的需要,你需要在同一个测试方法中考虑两个选项。您无法将mockito verify
调用与逻辑运算符结合使用,但有一点解决方法是:
boolean firstOptionFail = false;
try{
verify(first, times(1)).toString();
verify(second, never()).toString();
}catch (MockitoException e) {
firstOptionFail = true;
}
if(firstOptionFail){
verify(first, never()).toString();
verify(second, times(1)).toString();
}
答案 2 :(得分:0)
列表允许您多次放入相同的元素。所以你的测试可以像这样简单:
List<Object> list = ...;
Object spy = spy(new Object());
list.add(spy);
list.add(spy);
callToStringToOnlyOneRandomElement(list);
verify(spy, times(1)).toString();