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以阻止它被执行
因此,我们的问题是:
即使类在参数中声明为@Mocked,静态初始化代码仍会执行,这是预期的行为吗
为什么上面的BeforeClass代码无法模拟Utils的静态初始化代码
非常感谢你的帮助
共 (0) 个答案