我正在对现有类创建测试。其中许多资源包被定义为私有最终字段,该资源包在通过 new 创建对象时初始化。我声明了一个模拟的资源包,使用 PowerMock 的 mockStatic 方法来启用静态模拟,并模拟 getBundle 方法来返回我的模拟资源包。但是,当构造函数运行代码来初始化字段时,它只是创建新的资源包,而不是使用模拟的资源包。我觉得我错过了一个小细节,但我不知道它可能是什么。 所有这些都是一个问题的原因是:当我在本地运行测试时,它会毫无问题地创建 ResourceBundle 对象。但是,当测试通过我们的构建软件 (UCBuild( 运行时,它会抛出"找不到资源"异常,并且测试以及构建失败。
当我在调试中运行测试并在构造函数上设置方法断点时,我可以看到"strings"对象是使用实际的资源包创建的,而不是模拟的资源包。我一辈子都想不通为什么。
我尝试在不初始化字段的情况下声明字段,然后使用 class.getDeclaredField(( 和 Field.setAccesible(( 将资源包设置为指向我模拟的资源包,但当然,如果我运行重新初始化字段的代码,这只会被覆盖。
测试工人.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
}
提前致谢
发现问题。将Worker.class
添加到@PrepareForTest
注释行,一切正常。