Насмешка над статическим полем класса с использованием 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 = ...".