Java 在Mockito中模拟深层对象

Java 在Mockito中模拟深层对象,java,android,unit-testing,mocking,mockito,Java,Android,Unit Testing,Mocking,Mockito,我希望实现以下目标: Class A{ List<Class B> list; } Class B{ } @Mock A a; when(a.list.isEmpty()).then(true); // this throws an error 我必须使用getter: when(a.getList().isEmpty()).then(true); 但是我不想改变我的代码,在任何地方都使用getter 不能模拟对成员变量的直接访问。因此,您有几个选择: 使用吸气剂 将成员变量

我希望实现以下目标:

Class A{
List<Class B> list;
}

Class B{
}

@Mock
A a;
when(a.list.isEmpty()).then(true); // this throws an error
我必须使用getter:

when(a.getList().isEmpty()).then(true);

但是我不想改变我的代码,在任何地方都使用getter

不能模拟对成员变量的直接访问。因此,您有几个选择:

  • 使用吸气剂

  • 将成员变量设置为模拟实例(
    a.list=mock(…)
    或等效项)

  • 对于一个像列表这样的普通类,使用mock没有什么价值,因为您可以或多或少地直接设置您想要的行为。因此在本例中,
    a.list=new ArrayList()就足够了


  • 不能模拟对成员变量的直接访问。因此,您有几个选择:

  • 使用吸气剂

  • 将成员变量设置为模拟实例(
    a.list=mock(…)
    或等效项)

  • 对于一个像列表这样的普通类,使用mock没有什么价值,因为您可以或多或少地直接设置您想要的行为。因此在本例中,
    a.list=new ArrayList()就足够了


  • 我恐怕你真的没有选择的余地(除非你在某个时候做了类似于
    a.list=mock(…);
    的事情)。如果为了测试的目的,你希望列表是空的,那么你不能只使用一个空列表,而不模拟任何东西吗?说真的,使用getter。否则,您将遇到比这个问题多得多的问题。我恐怕您真的没有选择的余地(除非您在某个时候执行类似于
    a.list=mock(…);
    的操作)。如果出于测试的目的,您希望列表为空,那么您不能只使用空列表,而不模拟任何内容吗?说真的,使用getter。否则,您将遇到比这一个多得多的问题。
    when(a.getList().isEmpty()).then(true);