我们可以为JUnit测试模拟类的私有字段吗?

时间:2015-04-27 16:35:42

标签: java junit

如果要测试的类的某个公共方法使用私有字段,那么我们可以在JUnit测试方法中模拟该私有字段吗? 否则,如果您不能访问私有字段,则无法使用或修改其值并将其传递给JUnit测试以查看不同的结果。

1 个答案:

答案 0 :(得分:2)

使用反射(以下示例不是JUnit测试,但它的工作方式完全相同)。

使用private变量和print()方法的示例类,以确保set成功。

public class stackoverflow2 {
    private int testPrivate = 10;
    public void print(){
        System.out.println(testPrivate);
    }
}

使用反射以及getset方法调用类。请注意,设置testPrivateReflection不会改变testPrivate,因为它是值的本地副本,因此我们使用set

public class stackoverflow {
    public static void main(String[] args) throws IllegalArgumentException, 
            IllegalAccessException, NoSuchFieldException {
        stackoverflow2 sf2 = new stackoverflow2();
        Field f = sf2.getClass().getDeclaredField("testPrivate");
        f.setAccessible(true);
        int testPrivateReflection = (int)f.get(sf2);
        System.out.println(testPrivateReflection);
        f.set(sf2, 15);
        sf2.print();
    }
}