使用JMockit模拟静态类字段

时间:2014-07-16 14:13:50

标签: java unit-testing jmockit

我已经重新考虑了一个课程,我目前正在尝试更新单元测试以反映这一点。该类的一个附加功能是静态字段,如下所示:

private static JdbcTempate jdbcTemple = DbConfiguration.getJdbcTemplate();

在添加此字段后运行单元测试时,我得到空指针错误。我通过使用powermock使用createMock()WhiteBox.setInternalState()方法模拟字段来解决这个问题,这很容易。

然而,其中一套测试使用JMockit而不是powermock和mockito。有人能告诉我如何使用JMockit模拟这个字段吗?

2 个答案:

答案 0 :(得分:3)

可以使用JMockit轻松编写测试:

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

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

mockit.Deencapsulation类相当于WhiteBox,包括设置静态最终字段的功能。

答案 1 :(得分:1)

不确定这是否是您想要的,但您可以模拟DbConfiguration并训练它以返回方法getJdbcTemplate所需的值:

在你的TestClass中添加:

 @Mocked
 private DbConfiguration dbConfiguration;

在testMethod中添加:

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

当实例化拥有此私有静态字段的ClassUnderTest时,该字段的值不会超过" result = ..."。