常量字段在 Junit5 下仅初始化一次

问题描述 投票:0回答:1

我们正在迁移到 JUnit5 并删除 PowerMockito,因为 Mockito 现在支持 mockStatic。之前,PowerMockito 提供了 Whitebox.setInternalState(..) ,可以设置最终字段的值(常量)
我有一堂课像

public class MyClass {
    
    private static final String myField = Props.getString("myField");
    
    public boolean myMethod() {
        //uses my field
    }
    
}

我的测试看起来像这样

class MyClassTest {

    @Test
    void myTest() {
        try (MockedStatic<Props> propsMockedStatic = Mockito.mock(Props.class)) {
            propsMockedStatic.when(() -> Props.getString("myField")).thenReturn("Hello!!");
            MyClass myClass = new MyClass();
            //more code
        }
    }
}

问题是,当我引入更多测试时,我发现当我运行测试时,

myField
仅被模拟一次,尽管我每次都使用一个新实例。这会导致制动测试,因为在其他情况下,我希望
myField
具有不同的值,但当我单独运行它们时,一切都会成功完成

java constants junit5
1个回答
-2
投票

我在堆栈溢出帖子上找到的一个临时解决方法是这个https://stackoverflow.com/a/56043252/17984773。它适用于 JDK17、Junit5 和 Mockito 4.6。在这里回答这个问题是为了防止有人搜索同样的问题,对我来说,花了很多时间才找到这个答案。这可能是暂时的,但现在它有效

总而言之,对我有用的是开放对某些软件包的访问,如下所示。为了准确找到这里需要包含哪些包,我只是每次运行测试,然后错误地创建了这个数组

test {
test.jvmArgs = ["--add-exports","java.base/jdk.internal.access=ALL-UNNAMED",
                "--add-exports","java.base/sun.security.jca=ALL-UNNAMED",
                "--add-exports","java.xml/jdk.xml.internal=ALL-UNNAMED",
                "--add-exports","java.base/sun.security.action=ALL-UNNAMED",
                "--add-opens","java.base/sun.security.util=ALL-UNNAMED",
                "--add-opens","java.base/sun.util.calendar=ALL-UNNAMED",
                "--add-opens","java.base/java.lang.reflect=ALL-UNNAMED",
                "--add-opens","java.base/java.security.cert=ALL-UNNAMED",
                "--add-opens","java.base/java.text=ALL-UNNAMED",
                "--add-opens","java.base/java.math=ALL-UNNAMED",
                "--add-opens","java.sql/java.sql=ALL-UNNAMED",
                "--add-opens","java.base/java.security=ALL-UNNAMED",
                "--add-opens","java.base/java.util.regex=ALL-UNNAMED",
                "--add-opens","java.base/java.util.stream=ALL-UNNAMED",
                "--add-opens","java.base/java.util.concurrent=ALL-UNNAMED",
                "--add-opens","java.base/java.time=ALL-UNNAMED",
                "--add-opens","java.base/java.io=ALL-UNNAMED"]
}
© www.soinside.com 2019 - 2024. All rights reserved.