在Java中使用Mockito如何验证某个方法仅被调用一次且其确切参数忽略对其他方法的调用?
样例代码:
public class MockitoTest {
interface Foo {
void add(String str);
void clear();
}
@Test
public void testAddWasCalledOnceWith1IgnoringAllOtherInvocations() throws Exception {
// given
Foo foo = Mockito.mock(Foo.class);
// when
foo.add("1"); // call to verify
foo.add("2"); // !!! don't allow any other calls to add()
foo.clear(); // calls to other methods should be ignored
// then
Mockito.verify(foo, Mockito.times(1)).add("1");
// TODO: don't allow all other invocations with add()
// but ignore all other calls (i.e. the call to clear())
}
}
在本TODO: don't allow all other invocations with add()
节中应该做什么?
已经尝试失败:
verifyNoMoreInteractions(foo);
不。它不允许调用其他方法,例如clear()
。
verify(foo, times(0)).add(any());
不。没有考虑到我们允许一个呼叫add("1")
。
Mockito.verify(foo, Mockito.times(1)).add("1");
Mockito.verify(foo, Mockito.times(1)).add(Mockito.anyString());
第一个verify
检查预期的参数化呼叫,第二个verify
检查根本没有一个呼叫add
。
问题内容: 我正在使用Mockito 1.9.0。我将如何验证某个方法仅被调用一次,并且传递给它的字段之一包含某个值?在我的JUnit测试中, 方法“工作”调用方法“ m_orderSvc”(传递给对象的参数之一)。“ m_orderSvc”又包含一个成员字段“ m_contractsDao”。我想验证“ m_contractsDao.save”是否被调用一次,并且传递给它的参数包含某个值。 这可
问题内容: 我想测试一些在同一类中调用其他方法的方法。它们基本上是相同的方法,但是具有不同数量的参数,因为数据库中有一些默认值。我在这个上展示 因此,我想测试在调用方法getPrice(int)时是否调用了方法getPriceForOne()。基本上像平常一样调用getPrice(int)并模拟getPriceForOne。 请记住,我有一个更为复杂的文件,该文件可供其他人使用,它们必须全部放在一
问题内容: 是否有一种方法可以使每次调用方法时都会被调用的“超级方法”,即使对于未定义的方法也是如此?有点像这样: 编辑- 细节:我有一个库,该库进行了很多更新,并且每次更新都变得晦涩难懂。为了简化我的工作流程,我正在使程序自动更新库(需要执行我想做的事情,我不会具体说明原因,但是我的程序可以与将来的更新一起使用)并且我有混淆映射与库一起下载时,我想制作一种例如称为的代理,然后在我调用它时,将获得
问题内容: 我有以下结构: 该方法 可以 被许多线程同时调用。该 会 抛出异常(它在后台,可能成为过时的使用一些数据)。 如果引发异常,则执行一些耗时的任务,比如说“更新”所有当前数据,并且我可以调用。 问题: 如何确保只调用 一次 ?如果我在的条目中放置了原子标志,则不能确定何时清除该标志。 我该如何解决?请注意:由于它是一个外部API,因此我无法修改,并且我正在使用装饰器模式来使用它。 问题答
我在类中有一个签名为的方法。 我有一个调用方法的代码块: 如果我想测试databaseService.save(user)没有被调用,那么我如何用Mockito(3.3.3版)来做呢?
问题内容: 我有一个类是SUT,一个类是它的合作者。电话上以“ ”作为参数。然后,将为此添加更多元素,以使其状态与调用时的状态不同。这是我的测试用例。 请注意,协作者实际上是一个间谍对象,而不是模拟对象。该测试用例将失败,因为即使使用等于的参数调用了该测试用例,也因为它被修改了,并且其当前值不再等于。但是,这是应该工作的方式,所以我想知道是否有一种方法可以让Mockito在调用方法时存储参数快照,