我正在使用 Mockito 为现有类编写一些 Java 单元测试。但是,我无法提取此类对象调用方法作为嵌套调用一部分的参数。
例子:
public class SomeClass {
public SomeClass() {
//...
}
public someMethod(Foo foo) {
// Bar bar = ...
someOtherMethod(bar);
}
private someOtherMethod(Bar bar) {
//...
}
}
我想捕获 someOtherMethod()
的参数并验证 bar
是否正确。我可以使用 ArgumentCaptor
或 Mockito 中的其他功能来执行此操作吗?
最佳答案
模拟 someOtherMethod
不太可能为您提供有用的结果。 someMethod
是您公共(public) API 的一部分,但是 someOtherMethod
不是;通常,测试契约(someMethod 的返回值和副作用)很重要,但测试实现(someMethod 调用的私有(private)方法)是一种反模式。
- 理想情况下,只需测试
someMethod
的结果和副作用,并将其实现视为黑盒。您可能甚至不需要为此使用 Mockito。这是最纯粹的测试驱动开发形式:它使您可以自由地重构someMethod
,也许完全省略对someOtherMethod
的调用或缓存结果(等)而不编辑您的测试。 - 如果
someOtherMethod
调用外部服务,请将其设置为您的 SomeClass 实例上的可访问或可设置字段,然后模拟该服务。 与其他服务的交互可以合理地视为一般契约(Contract)的一部分;这正是 Mockito 的设计目的。 - 如果
someOtherMethod
足够独立以至于您想单独测试someMethod
,请考虑将其设为包私有(private)或 protected 。这样你就可以在你的测试中用一个虚拟的实现来覆盖它,也可能在你的代码的其他地方——毕竟,它现在是你的someMethod
契约的一个测试部分,对吧?如果它太大或不透明,您还可以考虑将其设为一个单独的可模拟类。
另见 "How do I unit test private methods?"在 Programmers.SE 中,或 "How to use Mockito when we cannot pass a mock object to an instance of a class"在 StackOverflow 上。
关于java - 使用 Mockito 从链式方法中捕获参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29500779/