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

Java 如何在测试中以不同的方式模拟具有相同参数的静态方法?,java,unit-testing,mocking,powermock,Java,Unit Testing,Mocking,Powermock,这似乎不太可能,但有没有一种方法可以让我以某种方式模拟静态方法,然后以另一种方式模拟第二次 一个案例场景- if(StringUtils.isEmpty("")) { throw Exception(); } ... if(StringUtils.isEmpty("")) { doSomething(); } 测试是按照以下方式编写的 mockStatic(StringUtils.class); when(StringUtils.isEmpty("")).thenReturn(fa

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

一个案例场景-

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.
你不应该用模仿来控制这些“内部”

通过控制到达静态调用的字符串值,您可以轻松地控制您的测试代码正在做什么。你希望测试结果是真实的;然后编写一个测试,输入一个空字符串;这需要一个例外

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


但是不要开始嘲笑这些方法。如果您认为必须这样做,那么您的设计是不可测试的;换句话说:破碎!修复您的设计,而不是使用大的模拟锤

你真的不应该改变一个纯粹的函数。假设您的字符串最终来自一个参数,在不同的测试用例中使用不同的参数运行。@chrylis但是,为了使它成为一个真正的单元测试,我不应该模拟任何外部依赖项,StringUtils来自另一个框架(apache.commons)不,您应该只模拟可以更改的外部行为,例如来自数据库调用的响应。你不会嘲笑
1+2
。使用
StringUtils
而不是内联检查(例如,使用Groovy的
asBoolean
)是一个实现细节。测试不同的情况--“将永远是空的。@chrylis找到你了。我找到了一个和你说的有关的链接。感谢您的快速访问!