有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JavaJMockit与静态初始化

我们正在使用Jmockit进行单元测试,我们对模拟类的静态初始化有疑问。当我们通过在函数参数中将一个类声明为(@Mocked final)来模拟它时,我们期望该类的静态初始化也会被模拟,但事实并非如此。下面是一个显示问题的示例

class TmpClass {

    static public int method1(){
        System.out.println("AClass method1 is called");
        return 10;
    }

    static public int method2(){
        System.out.println("AClass method2 is called");
        return 20;
    }


}

class Utils {
    static public int sInt = TmpClass.method1();
    public int pInt = TmpClass.method2();

    static public int method(){
        System.out.println("Should NOT be called when Utils is mocked.");
        return 1000;
    }

}

class ClassToTest {

    public int foo(){
        return Utils.method();
    }

    public int goo(){
        return Utils.sInt;
    }

}

public class TestPost {

    @Test
    public void test(@Mocked final Utils mocked) {
        System.out.println("This should show 0 as expected since Utils is mocked: " + new ClassToTest().foo());
        System.out.println("This should show 0 as expected since Utils is mocked: " + mocked.pInt);

        System.out.println("This should be 0 but it is not: " + new ClassToTest().goo());
        System.out.println("This should be 0 but it is not: " + mocked.sInt);
    }

}

这里我们有一个我们想要测试的ClassToTest。它取决于一个名为Utils的类。因此,我们通过在函数参数中声明(@mocked fine Utils mocked)来模拟Utils。此后,, 1.静态方法Utils。方法按预期进行模拟。所以,我们来测试一下。foo按预期返回0。 2.但是静态变量Utils。辛特没有被嘲笑。TmpClass。method1实际上被调用,Utils。sInt被分配到10。 3.成员变量Utils。品脱被嘲笑了。嘲笑。品脱按预期显示为0

由于上面的2,TmpClass。方法1被调用。因为我们不想在测试环境中执行TmpClass,所以下一步我们尝试将以下内容放入TestPost中

@BeforeClass
static public void init(){
    new MockUp<Utils>(){
        @Mock
        public void $clinit(){

        }
    };
}

但这是行不通的。特姆班。方法1仍然被称为!我们必须直接模拟TmpClass以阻止它被执行

因此,我们的问题是:

  1. 即使类在参数中声明为@Mocked,静态初始化代码仍会执行,这是预期的行为吗

  2. 为什么上面的BeforeClass代码无法模拟Utils的静态初始化代码

非常感谢你的帮助


共 (0) 个答案