0

我正在对现有类创建测试。它们中的许多具有定义为私有 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

    }

提前致谢

4

1 回答 1

0

发现了问题。添加Worker.class@PrepareForTest注释行,一切正常。

于 2019-10-03T18:47:42.003 回答