0

我使用 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在每次运行新测试时重新加载类?

4

1 回答 1

2

第二个测试失败的原因是您log@Before方法中为每个测试创建了一个新实例,但由于调用Logger.getInstance()isstatic它只发生一次。考虑做你@Before@BeforeClass.

似乎没有理由log为每个测试创建一个新实例。它是一个mock,因此可以重新设置。

于 2011-11-14T12:59:33.887 回答