我正在对现有类创建测试。它们中的许多具有定义为私有 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
}
工人.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
}
提前致谢