我正在对现有类进行测试。他们中的许多人将资源束定义为私有final字段,当通过new创建对象时初始化该资源束。我声明了一个模拟的ResourceBundle,使用PowerMock的mockStatic方法启用静态模拟,并模拟getBundle方法来返回模拟的ResourceBundle。但是,当构造函数运行代码以初始化字段时,它只是创建新的资源束,而不是使用模拟的资源束。我觉得我错过了一个小细节,但我不知道它可能是什么。所有这些都是问题的原因是这样的:当我在本地运行测试时,它将创建ResourceBundle对象而不会出现问题。但是,当通过我们的构建软件(UCBuild)运行该测试时,它将引发“找不到资源”异常,并且该测试因而构建失败。
[当我在调试中运行测试并在构造函数上设置方法断点时,我可以看到“字符串”对象是使用实际资源包而不是模拟资源包创建的。我无法一生找出原因。
我尝试声明该字段而不对其进行初始化,然后使用class.getDeclaredField()和Field.setAccesible()将资源束设置为指向我的模拟对象,但是,如果我运行该代码,这当然会被覆盖重新初始化该字段。
测试Worker.java的WorkerTest类:
@RunWith(PowerMockRunner.class)
@PrepareForTest({FacesContext.class, SaveStatus.class, FacesMessage.class, ResourceBundle.class})
public class WorkerTest {
@Mock
private ResourceBundle mockRB;
@Before
public void setUp() throws Exception {
PowerMockito.mockStatic(ResourceBundle.class);
PowerMockito.when(ResourceBundle.getBundle(anyString())).thenReturn(mockRB);
PowerMockito.when(mockRB.getString(anyString())).thenReturn("tst");
sut = new Worker(); // Breakpoint here to verify mockRB exists
}
...some tests
}
Worker.java:
@Named
@ApplicationScoped
public class Worker implements Serializable {
private static final long serialVersionUID = 4075799125164038417L;
private final ResourceBundle strings = ResourceBundle
.getBundle("com.resources.strings");
public Worker() { //method breakpoint here
}
提前感谢
发现了问题。将Worker.class
添加到@PrepareForTest
注释行中,一切正常。