我使用 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 具有过时的日志实例。我可以显式注入(inject)新的记录器实例,但是当有很多静态变量需要模拟时,这很麻烦。
如何设置 junit 在每次运行新测试时重新加载类?
最佳答案
第二个测试失败的原因是您正在为每个测试的 @Before
方法中创建一个新的 log
实例,但自从调用 Logger .getInstance()
是静态
,它只发生一次。考虑在 @BeforeClass
中执行 @Before
中的操作。
似乎没有理由为每个测试创建一个新的 log
实例。它是一个模拟
,因此可以重置。
关于java - junit 重新加载类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8121891/