【发布时间】:2021-07-13 16:49:26
【问题描述】:
简而言之,我有一组生成的源代码,我需要能够基于外部的非 Java 配置动态模拟它们——它们没有遵循一致的模式/实现除静态之外的任何接口,这意味着我只能知道如何在运行时模拟方法并且需要使用 PowerMockito 来做到这一点。
说我有这门课:
public class SomeClass {
public static void doSomething(Integer i) {
throw new RuntimeException();
}
}
我只是想模拟 doSomething / 让它不抛出异常。为了简单/没有我在用例中提到的任何复杂性,我可以这样做:
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
@RunWith(PowerMockRunner.class)
@PrepareForTest(SomeClass.class)
public class TestSomeClass {
@Test
public void testDoSomethingSimple() throws Exception {
PowerMockito.spy(SomeClass.class);
PowerMockito.doNothing().when(SomeClass.class, "doSomething", any(Integer.class));
SomeClass.doSomething(5);
}
}
效果很好。
然而,当我们退后一步并尝试解决我的需求并将复杂性转移到这样的事情时,情况就会发生变化:
@Test
public void testDoSomething() throws Exception {
// Below showing how everything could be externally-driven
testDoSomething("SomeClass", "doSomething", "java.lang.Integer");
SomeClass.doSomething(5);
}
public void testDoSomething(
final String canonicalClassName, final String methodName, final String... canonicalParameterClassNames)
throws Exception {
final Class<?> clazz = Class.forName(canonicalClassName);
PowerMockito.spy(clazz);
final Object[] argumentMatchers = new Object[canonicalParameterClassNames.length];
for (int i = 0; i < canonicalParameterClassNames.length; i++) {
argumentMatchers[i] = any(Class.forName(canonicalParameterClassNames[i]));
}
PowerMockito.doNothing().when(clazz, methodName, argumentMatchers);
}
经过多次摸索,设法更简洁地复制了这个错误:
@Test
public void testDoSomethingIssueIsolated() throws Exception {
PowerMockito.spy(SomeClass.class);
Object matcher = any(Integer.class);
PowerMockito.doNothing().when(SomeClass.class, "doSomething", matcher);
SomeClass.doSomething(5);
}
似乎表明导致此问题的原因是 创建参数匹配器的调用在哪里,这很奇怪。
【问题讨论】:
-
您能否将您的 pom.xml 与您正在使用的库版本共享?
标签: java junit mockito variadic-functions powermock