检查元素是否验证条件

时间:2018-01-07 23:54:29

标签: java unit-testing java-8 mockito

我有一个对象列表。我想知道是否有一些对象方法被调用。

即:

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

3 个答案:

答案 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();
相关问题