java - 如何在测试中以不同的方式模拟具有相同参数的静态方法?

标签 java unit-testing mocking powermock

这似乎不太可能,但是有没有办法可以以某种方式模拟静态方法,然后以另一种方式第二次模拟静态方法?

案例场景 -

if(StringUtils.isEmpty("")) {
   throw Exception();
}
...
if(StringUtils.isEmpty("")) {
   doSomething();
}

测试按以下方式编写。

mockStatic(StringUtils.class);
when(StringUtils.isEmpty("")).thenReturn(false);
/*Is it possible to make this behaviour run only once such that second time
when it is called we can mock it again.*/
limitStaticMock(times(1));//Is this possible?
when(StringUtils.isEmpty("")).thenReturn(true);//Setting behaviour again.

最佳答案

您不应该使用模拟来控制此类“内部结构”。

您可以通过控制访问该静态调用的字符串值来轻松控制被测代码正在执行的操作。您希望测试结果为真;然后编写一个压入空字符串的测试;并且预计会有异常(exception)。

你有另一个不应该抛出的生产代码方法 - 然后编写另一个测试;并进行必要的设置。

但是不要开始 mock 此类方法。如果您认为必须这样做,那么您的设计就不可测试;换句话说:坏了!修复你的设计,而不是使用大锤子!

关于java - 如何在测试中以不同的方式模拟具有相同参数的静态方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43038803/

相关文章:

java - 定期刷新大对象

javascript - 用 Jest 模拟 ES6 类函数

javascript - 抛出 mocha 异常可以使测试在不应该通过的情况下通过

c# - NUnit 不运行我的新测试

Java - 使用 Mockito 测试模拟

java - 嵌套循环不会在长度大于 1 的内部循环中执行查询

java - 通过服务器更新Listview并显示更新后的 ListView 而不连接

java - 有什么方法可以让我的 JFrame 居中吗?

java - @RunWith(PowerMockRunner.class) 与@RunWith(MockitoJUnitRunner.class)

c++ - C++ 中的模拟实现