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

Java 我们可以为JUnit测试模拟类的私有字段吗?,java,junit,Java,Junit,如果要测试的类的某个公共方法正在使用私有字段,那么我们可以在JUnit测试方法中模拟该私有字段吗? 否则,如果你没有;如果您没有访问私有字段的权限,则无法使用或修改其值并将其传递给JUnit测试以查看不同的结果。使用反射(以下示例不是JUnit测试,但其工作原理完全相同) 带有private变量和print()方法的示例类,以确保set成功 public class stackoverflow2 { private int testPrivate = 10; public voi

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

使用反射(以下示例不是JUnit测试,但其工作原理完全相同)

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

public class stackoverflow2 {
    private int testPrivate = 10;
    public void print(){
        System.out.println(testPrivate);
    }
}
使用反射和
get
set
方法调用类。注意,设置
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();
    }
}

你说的“模拟私人领域”是什么意思?你的意思是“将一个私有字段设置为模拟”吗?所以你有一个类a,它有一个类B作为字段,你想模拟它吗?您可以使用
ReflectionTestUtils
(来自spring)将值注入到私有字段中,如果这正是您需要的。如果该字段是一个原语值,那么就不可能“模拟”它。您应该测试接口,而不是实现。是的。我刚刚读了一些关于Mockito的文章。这个ReflectionTestUtils和Mockito一样吗?单元测试中的经验法则是,如果您意识到需要访问私有字段或方法,那么您的设计就很糟糕。您应该只访问正在测试的类的公共方法。如果需要测试私有方法,那么可能应该将它们提取到单独的类中。您绝对不应该编写需要更改私有字段值的测试。