java - Powermock verifyPrivate 不适用于 any()
问题描述
我有一个私有方法,我想在不关心参数的情况下测试它的调用。我想测试它是否被调用。
MyClass.java
public void doStuff(){
unload(args);
}
private void unload(List<String> args) {
//
}
所以我使用了以下内容:
MyClasstest.java
MyClass myClass = PowerMockito.spy(new MyClass());
myClass.doStuff();
verifyPrivate(myClass, times(1)).invoke("unload",any(List.class));
// verifyPrivate(myClass, times(1)).invoke("unload",any()); //same result with this
此测试失败,但出现以下异常:
需要但未调用 com.MyClass.unload(null);
然而,这个模拟还有其他交互......(调用它的实际值)
可以仅使用实际参数而不使用 来调用 verifyPrivateany()
吗?
解决方案
这是您尝试做的一个工作示例:
您可能只是错过了@PrepareForTest
注释,它必须指向正确的类。如果你的类是一个外部的 use @PrepareForTest(MyClass.class)
,下面的例子用一个内部类来展示它。
@RunWith(PowerMockRunner.class)
@PrepareForTest(MyClassTest.class)
public class MyClassTest {
static class MyClass {
public void doStuff(){
unload(null);
}
private void unload(List<String> args) {
}
}
@Test
public void test() throws Exception {
MyClass myClass = PowerMockito.spy(new MyClass());
myClass.doStuff();
PowerMockito.verifyPrivate(myClass, Mockito.times(1)).invoke("unload", Mockito.any());
}
}
请注意,您应该考虑是否真的要在 UnitTest 中执行此操作。通常你的 UnitTest 不应该关心是否private
使用了一个方法,它应该专注于验证是否返回了正确的结果或达到了正确的对象状态。
通过将有关类的内部行为的知识添加到其中,您的测试与实现紧密耦合,这可能不是一件好事。
推荐阅读
- javascript - 如何部分呈现已转义元素的 HTML
- sql-server - 将日期时间从 csv 批量加载到 SQL Server 时如何修复“批量加载数据转换错误”
- javascript - 是否严格要求调用 IntersectionObserver.unobserve()?
- android - 摄像头意图 WebView android
- ubuntu - NTP 与 GPS 同步
- asp.net-mvc - 如何将复选框选中的值绑定到列表
在视图模型中? - python - 如何列出文件夹并扫描它们
- linux - yum 安装一个包含所有必需依赖包的包
- flutter - Flutter视频播放器没有音频
- python - 在 Python 中计算两种不同日期格式之间的时间差