我使用powermock来模拟Logger.getInstance()方法。这会导致问题,因为junit似乎没有重新加载类,并且在第一个测试测试类有错误的记录器实例之后。
public class LoggedClass {
public static Logger log = Logger.getInstance();
....
}
@RunWith(PowerMockRunner.class)
@PrepareForTest({ LoggedClass.class, Logger.class })
public class SomeTests {
private Logger log;
@Before
public void setUp() {
PowerMockito.mockStatic(Logger.class);
log = PowerMockito.mock(Logger.class);
PowerMockito.when(Logger.getInstance()).thenReturn(log);
PowerMockito.mockStatic(LoggedClass.class);
}
@Test
public void firstTest() {
assertTrue(LoggedClass.log == log);
}
@Test
public void secondTest() { // fails
assertTrue(LoggedClass.log == log);
}
}
测试失败,因为LoggedClass已经过时了日志实例。我可以显式注入新的记录器实例,但是当需要模拟许多静态变量时,这很麻烦。
如何在每次运行新测试时将junit设置为重新加载类?
答案 0 :(得分:2)
第二次测试失败的原因是您在log
方法中为每个测试创建了@Before
的新实例,但由于对Logger.getInstance()
的调用是static
它只发生过一次。考虑在@Before
中@BeforeClass
执行您的操作。
似乎没有理由为每个测试创建log
的新实例。它是mock
,因此可以重置。