Mockito .thenReturn(list.add())实际上在我的列表中添加了一些内容

时间:2018-01-11 09:46:58

标签: java list mocking mockito

我正在尝试测试我的一个函数,如果条件为真,它会向数据库添加一些东西。 现在在我的测试类中,我试图在列表中模拟它:

List list = new ArrayList();
String myString  = "";

when(xxx.addToDatabase()).thenReturn(list.add(myString));

因此,如果我的条件为真,那么这个断言应该是正确的:

AssertTrue(list.contains(Object)).

如果我的条件是假的,那么这个断言应该适用:

AssertFalse(list.contains(Object));

所以我的问题是,我的列表总是包含Object,因为.thenReturn似乎被调用,即使它实际上没有被调用。

有没有办法阻止调用list.add()

2 个答案:

答案 0 :(得分:1)

这一行:

when(xxx.addToDatabase()).thenReturn(list.add(myString));

...在 test 中调用,无论是否在测试代码中调用xxx.addToDatabase()

因此,您要在测试用例中将myString添加到list。这解释了以下内容:

  

我的列表总是包含对象

重新:

  

有没有办法防止调用list.add()?

我认为在这里如何使用模拟可能存在一些误解。

以下一行......

when(xxx.addToDatabase()).thenReturn(list.add(myString));

...表示:当调用xxx.addToDatabase()时,返回true,因为list.add()返回一个布尔值。我怀疑你想要发生的是list.add作为xxx.addToDatabase()副作用。如果是,那么您可能希望使用doAnswer而不是doReturn。如果您使用MCVE更新问题,则可以更轻松地为您提供指导。

答案 1 :(得分:0)

这就是你应该做的。

List<> someList = new ArrayList();
doAnswer(invocation -> {
    someList.add(myString);
     // return something
    }).when(xxx).addToDatabase();