如何用私有字段模拟类



我试着用Mockito测试一个单例类,像这样:

  public class Single {
     private ID id;
     private Single(){}  //private constructor 
     public static Single getSingle(){ // ***code to get instance*** }
     // method I want to test
     public String getName(){ 
        String name = id.getRawName(); // need field id here
        ** additional operations on name ** // code need to be tested
        return name;
     }
  }

我试着模拟这个类,用反射设置字段"id",像这样:

Single sg = Mockito.mock(Sincle.class);
Field myID = sg.getClass().getDeclaredField("id"); // fails here
myID.setAccessible(true);
myID.set(sg, <ID instance>);

但是getDeclaredField()方法失败,除了

. lang。NoSuchFieldException: id

我猜这是因为id字段是null实例sg。

所以我想知道是否有什么我可以做的测试这个方法不修改原始类?

mock不是真正的对象。您不能设置mock的声明字段,因为它不存在1!

在编写测试时,您通常希望模拟所有而不是的类:

  • 被测系统(在本例中为Single)类
  • 数据结构(如List)和其他pojo。

因此,你真正想要嘲笑的是ExternalCall,你没有真正解释它在你的问题中是如何工作的。但是,如果它是静态方法,则需要使用PowerMock。参见:用Mockito模拟静态方法

注意你的错误是NoSuchFieldException,因为你实际上没有一个真实的实例。它是而不是,因为:

我猜这是因为id字段是null实例sg。

这是因为字段实际上不存在1在mockit生成的子类中,而不是因为它是null

1:它确实存在于mock的超类中(在本例中为Single),但是它的值被模拟行为捕获,除非将其用作部分模拟,否则将被忽略。但是,这是一个技术细节,与Mockito的正确使用无关。

…我可以做些什么来测试这个方法而不修改原始类?

是的,有。使用Mockito作为基本用途:

when(sg.getId()).thenReturn("123")

最新更新