java如何对foo bar调用方法_关于java:如何验证未使用Mockito调用特定方法?

在Java测试中,如何确保对象的依赖项方法未被调用?本文介绍了使用Mockito的`never()`方法进行验证,以及讨论了`verifyNoMoreInteractions()`和`verifyZeroInteractions()`的使用场景。文章还探讨了过度使用这些方法可能带来的问题,强调在单元测试中验证合同的重要性。
摘要由CSDN通过智能技术生成

如何验证没有对对象的依赖项调用方法?

例如:

public interface Dependency {

void someMethod();

}

public class Foo {

public bar(final Dependency d) {

...

}

}

使用FOO测试:

public class FooTest {

@Test

public void dependencyIsNotCalled() {

final Foo foo = new Foo(...);

final Dependency dependency = mock(Dependency.class);

foo.bar(dependency);

**// verify here that someMethod was not called??**

}

}

更有意义的是:

import static org.mockito.Mockito.never;

import static org.mockito.Mockito.verify;

// ...

verify(dependency, never()).someMethod();

此功能的文档在第4节"验证调用的确切数量/至少x/never",这里是neverjavadoc。

使用never是最好和最具体的方法,但是如果需要检查整个模拟对象,也可以考虑使用verifyZeroInteractions(mockObject)或verifyNoMoreInteractions(mockObject)。

使用Mockito.verify方法的第二个参数,如:

verify(dependency, Mockito.times(0)).someMethod()

Mockito.never()是一种更具表现力/可读性的选择。

public static verificationmode never()返回次数(0);

与times(0)相比,never()的可读性不明显。但是,never的存在确实增加了认知负荷,使mockito系统更难理解和记忆如何使用。所以真正的mockito不应该把never包含在他们的api中,这不值得精神上的花费。

问题:这个表单是否验证了someMethod被调用了0次,或者只验证了someMethod从未被零参数调用?

@B T——我想它会用零参数验证someMethod——称为零次——未验证。

作为更一般的模式,我倾向于在测试中使用@After块:

@After

public void after() {

verifyNoMoreInteractions(, ...);

}

然后测试可以自由地验证应该调用什么。

此外,我发现我经常忘记检查"没有互动",只是后来发现被调用的东西不应该被调用。

所以我发现这个模式对于捕捉所有未经特别验证的意外呼叫很有用。

mockito文档指出,这种模式不应该被滥用--"一句警告:有些用户做了很多经典的、期望运行的、验证的mocking,即使在每个测试方法中,也经常使用verifynomoreintections()。不建议在每个测试方法中使用verifynomoreintections()。verifynomoreintections()是交互测试工具包中的一个方便断言。只有在相关的时候才使用它。滥用它会导致过度指定、维护性较低的测试。

"仅在相关时使用"。我觉得它总是相关的。我不认为这种模式是虐待:正如我所说,它发现"人们所说的事情本来不应该被称为虐待"。对我来说,这是一个至关重要的验证:如果有什么东西在调用它不应该使用的存储库,我想知道它的情况!除非有另一种方法不使用verifyNoMoreInteractions来验证这一点?这里的其他答案依赖于测试作者明确记住列出这些检查:这在我的书中太容易出错。

我看到了这个评论,但也觉得推理不太有说服力。我想多了解一下为什么不推荐这样做。

@Tobinibot是因为单元测试的思想是验证合同。大多数契约通常不涉及调用其他方法的次数,而是传递已知参数导致已知响应。通过不再使用交互,您基本上是逐行验证实现,这使得重构和实现变得单调乏味。这不是单元测试的重点。

verifyNoMoreInteractions()和verifyZeroInteracions()方法的内部实现与以下方法相同:

public static transient void verifyNoMoreInteractions(Object mocks[])

{

MOCKITO_CORE.verifyNoMoreInteractions(mocks);

}

public static transient void verifyZeroInteractions(Object mocks[])

{

MOCKITO_CORE.verifyNoMoreInteractions(mocks);

}

所以我们可以在模拟对象或模拟对象数组上使用它们中的任何一个来检查是否没有使用模拟对象调用任何方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值