классы перезагрузки джунта - PullRequest
0 голосов
/ 14 ноября 2011

Я использую 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 на перезагрузку классов при каждом запуске нового теста?

1 Ответ

2 голосов
/ 14 ноября 2011

Причина, по которой второй тест не пройден, заключается в том, что вы создаете новый экземпляр log в своем методе @Before для каждого теста, но поскольку вызов Logger.getInstance() равен static, он происходит только один раз. Подумайте о том, чтобы делать то, что у вас есть в @Before в @BeforeClass.

Кажется, нет причин создавать новый экземпляр log для каждого теста. Это mock и поэтому может быть просто сброшено.

...