Насмешка над статическим полем класса с использованием JMockit

Я пересмотрел класс и сейчас пытаюсь обновить модульные тесты, чтобы отразить это. Одним из добавлений к классу является статическое поле, как показано ниже:

private static JdbcTempate jdbcTemple = DbConfiguration.getJdbcTemplate();

При запуске модульных тестов после добавления этого поля я получал ошибки нулевого указателя. Я решил это, высмеивая поле, используя powermock с createMock() а также WhiteBox.setInternalState() методы, достаточно просто.

Однако один из наборов тестов использует JMockit вместо powermock и mockito. Кто-нибудь сможет показать мне, как я могу издеваться над этим полем, используя JMockit?

2 ответа

Решение

Тест легко можно написать с помощью JMockit:

@Test
public void setStaticField(@Mocked JdbcTemplate mockTemplate)
{
    Deencapsulation.setField(ClassUnderTest.class, mockTemplate);

    assertSame(mockTemplate, ClassUnderTest.getJdbcTemplate());
}

mockit.Deencapsulation класс эквивалентен WhiteBoxВ том числе в умении задавать статические финальные поля.

Не уверен, что это именно то, что вам нужно, но вы можете смоделировать DbConfiguration и обучить его возвращению нужного значения для метода getJdbcTemplate:

В ваш TestClass добавьте:

 @Mocked
 private DbConfiguration dbConfiguration;

В вашем тестовом методе добавьте:

new NonStrictExpectations() {{
    DbConfiguration.getJdbcTemplate();
    result = new JdbcTemplate( "mock" ); // or return what ever you want your private field to  contain...
}};

При создании экземпляра вашего ClassUnderTest, которому принадлежит это частное статическое поле, поле, которое имеет значение, определенное как "result = ...".

Другие вопросы по тегам