如何断言使用 mockito 调用方法

Posted

技术标签:

【中文标题】如何断言使用 mockito 调用方法【英文标题】:How to assert that methods are called with mockito 【发布时间】:2015-10-12 22:28:49 【问题描述】:

我想问更多与测试相关的概念性问题。我正在使用 Mockitos 进行单元测试。

我有一个方法可以做很多事情。它在内部调用的所有方法都是 void 方法,这些方法又会执行一些其他操作。所讨论的方法可以有异常或无异常完成。没有编写断言语句的范围,因为它主要调用 void 方法。另外,我已经为这个类的所有其他方法编写了独立的单元测试。

我的问题是,如果我需要测试覆盖率,我应该为所有方法编写测试用例。但是,我没有为我的一种方法找到任何有效的断言。从单元测试覆盖率的角度来看,所讨论的方法是一种重要的方法。当我运行我的测试时,我确实在日志中看到这些方法执行得很好,但实际上没有什么可以断言的。遇到这种情况我该怎么办?

1) 在没有任何断言的情况下保持方法不变?它仍在检查一切是否按预期工作

2) 创建 2 个方法,一个期望异常(Negative Testcase)和一个没有断言的常规测试方法。 (这基本上表明我已经涵盖了积极和消极的情况)。我这里还没有任何断言。

这是正确的方法还是有更好的方法来处理这个问题?

【问题讨论】:

您说您正在使用 Mockito 进行测试。您是否正在使用被测试此方法调用的对象的模拟?在这种情况下,您可以使用 Mockito 的 verify() 来验证是否按预期调用了适当的其他方法。然后,您正在验证行为,并且不需要断言。 @nikpon 请阅读完整的问题陈述,我确实说过我已经涵盖了从该方法调用的所有带有 assert 的方法。 【参考方案1】:

如果你没有任何值得断言的东西,你可以尝试验证。

verify(someMock, times(x)).someMethod();

文档中有关使用 Mockito 进行验证的更多信息:https://mockito.googlecode.com/hg-history/1.5/javadoc/org/mockito/Mockito.html

【讨论】:

+1 因为这可能是用户想要的,但我绝对坚持我的评论,即弄清楚为什么 OP 没有任何东西可以断言。跨度> 【参考方案2】:

为什么没有什么可以断言的?如果你运行你的方法,让 A 成为宇宙。如果你不运行你的方法,让 B 成为宇宙。如果 A == B 然后停止调用该方法,它什么也不做。如果 A != B 则断言它们的不同之处都是正确的。

即,您的方法实际上是在做什么?这应该是你测试的一部分。

【讨论】:

这个方法就像一个执行方法,它调用所有不同的方法来完成执行。这就是它没有明确地做任何事情的原因。它就像一个持有人方法。如果任何被调用的方法因某些异常而失败,则此方法会捕获它。这就是为什么我可以通过传递允许其他方法失败的值来创建否定测试用例,从而允许它抛出异常。对于阳性测试用例,我不确定除了调用 verify 是否可以做其他事情。 @Shyna 是的,Mockito 可以做到。我首先要求您将您的问题明确更改为“如何断言使用 mockito 调用方法”。使用 mocks + verify 是正确的做法。如果您仍然遇到问题,我可以在您更新问题后整理出一个完整的答案(老实说这可能是一个重复的问题)。 @djechiln 我会更新它,我只是想检查是否有其他方法。我没有卡住,谢谢!

以上是关于如何断言使用 mockito 调用方法的主要内容,如果未能解决你的问题,请参考以下文章

使用 Mockito 的通用“any()”方法

Mockito:您如何验证某些方法调用组的组顺序?

如何使用 mockito verify() 调用两次方法来验证方法

如何使用mockito调用枚举类型中的私有方法

Mockito - 验证对象根本没有被调用

使用 Mockito 多次调用具有相同参数的相同方法