我试图测试下面的类,该类调用一个单例,通过模拟它来初始化私有静态最终变量,遵循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
的价值,但似乎无法嘲笑它。我做错了什么?
答案 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)
当然,如果您可以添加新库,它将起作用。