【发布时间】:2018-02-16 16:52:18
【问题描述】:
假设我有以下课程
public class StaticClass {
public static void staticMethod() throws SomeException {
System.out.println("staticMethod");
}
private StaticClass() {
}
}
和
public class SomeClass {
public void someMethod() {
try {
StaticClass.staticMethod();
}catch(SomeException ex) {
System.out.println("SomeException occurred");
return;
}
System.out.println("SomeException didn't occur");
}
}
我正在测试的
@RunWith(PowerMockRunner.class)
@PrepareForTest(StaticClass.class)
public class SomeClassTest {
@Test
public void testStaticMethod() throws Exception {
mockStatic(StaticClass.class);
doThrow(new SomeException("unimportant message")).when(StaticClass.class,
"staticMethod");
//test something where exception is needed
SomeClass instance = new SomeClass();
try {
instance.someMethod();
fail("IllegalStateException expected");
}catch(IllegalStateException expected) {
}
//now test something where exception isn't needed
instance.someMethod();
}
}
如何撤消静态模拟/抛出SomeException 的配置,以便我可以在第二个instance.someMethod() 中的try-catch 块之后测试代码?
PowerMock: How to unmock a method? 不适用,因为没有模拟引用传递给Mockito.reset,而传递StaticClass 导致java.lang.ClassCastException: java.lang.Class cannot be cast to org.mockito.internal.creation.bytebuddy.MockAccess。
SomeException 只是扩展 Exception。
https://gitlab.com/krichter/powermock-undo-statik-mocking 提供 SSCCE。
我正在使用 PowerMock 1.7.3。
【问题讨论】:
-
单个测试做得太多 - 尝试拆分为多个测试,例如
testStaticMethodHappyPath()和testStaticMethodWhenSomethingUnexpectedHappened()。 -
我是增强我的测试结构的建议,或者应该有助于解决问题。如果它解决了问题,我很乐意解释为什么会这样。
标签: java static mocking powermock powermockito