我在做什么错误使用mockito和反射模拟这个私有静态最终变量?

时间:2016-04-23 00:53:13

标签: java unit-testing mockito

我试图测试下面的类,该类调用一个单例,通过模拟它来初始化私有静态最终变量,遵循this示例。

这就是我正在做的事情

<%= simple_form_for(@challenge)  do |f| %>
  <%= f.text_field :name %>

  <%= f.radio_button :category, 'goal', class: 'date-format-switcher' %>
  <label for="challenge_category_goal">Goal</label>

  <%= f.radio_button :category, 'habit', class: 'date-format-switcher' %>
  <label for="challenge_category_habit">Habit</label>

  etc....

其中状态是一个枚举。

测试类:

MouseInfo

}

我并不关心JScrollPane的价值,但似乎无法嘲笑它。我做错了什么?

2 个答案:

答案 0 :(得分:1)

TestClassToTest中的代码看起来不错,但访问ClassToTest.class.getDeclaredField("CONF_FLAG")会初始化静态最终ClassToTest#CONF_FLAG字段,您会在NullPointerException中指明结果。

我假设您无法修改ClassToTest中的源代码。作为修复,您可以在setUp()中初始化Configuration单例,例如使用其公共API方法,以便Configuration.getConfig().get(Status.Initialization).getConfFlag()调用成功吗?

如果是这样,您可以采用这种方法为测试准备Configuration对象,而不是使用反射。

答案 1 :(得分:1)

当你的类被加载时,这行被称为

private static final boolean CONF_FLAG = Configuration.getConfig().get(Status.Initialization).getConfFlag(); 

因此,要解决此问题,我建议您使用PowerMock

使用PowerMock,您可以使用@SuppressStaticInitilizationFor轻松跳过unnecessary behavior

此外,您将能够轻松设置内部状态:

Whitebox.setInternalState(ClassToTest.class, "CONF_FLAG", true)

当然,如果您可以添加新库,它将起作用。