java - Mockito 不使用 @Spy 模拟私有(private)变量

标签 java mockito spy

我正在尝试使用 Mockito 的 @Spy 注释模拟私有(private)实例变量 listOfStrings

@RunWith(MockitoJUnitRunner.class)
public class MyObjectTest {

  @InjectMocks
  MyObject myObject;
  @Spy
  List<String> listOfStrings;

  @Before
  public void before() {
    myObject = new MyObject();
  }

  @Test
  public void testCallListOfStrings() {
    Mockito.doReturn(new ArrayList().stream()).when(listOfStrings).stream();
    myObject.callListOfStrings();
  }
}

public class MyObject {

  private List<String> listOfStrings;

  public void callListOfStrings() {
    listOfStrings.stream().forEach(System.out::println);
  }
}

显然,它似乎没有模拟实例变量,而是抛出了NullPointerException

最佳答案

myObject = new MyObject(); - 这是问题的根源。 Mockito 为您实例化模拟,但您要用自己的 myObject 实例替换模拟,这会导致 NPE(显然,listOfStrings在新实例化的对象中为 null)。

它应该如何工作:

@RunWith(MockitoJUnitRunner.class)
public class MyObjectTest {

    // Don't do this with List! 
    // Type 'List' is an interface and it cannot be spied on.
    @Spy
    private ArrayList<String> listOfStrings;
    @InjectMocks
    private MyObject myObject;

    @Before
    public void before() {
        listOfStrings.addAll(List.of("test", "test2"));
    }

    @Test
    public void testCallListOfStrings() {
        Mockito.doReturn(new ArrayList().stream()).when(listOfStrings).stream();
        myObject.callListOfStrings();
    }
}

输出:

test
test2

关于java - Mockito 不使用 @Spy 模拟私有(private)变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50355405/

相关文章:

java - 为什么我在模拟时会收到 NullPointerException?

unit-testing - 监视 Golang 中的方法

Java游戏选择玩家类

java - 多重就业和全局值(value)

java - 如何在模拟对象上使用 setter?

java - 如何测试(模拟)使用外部 API 的对象(Jama Software)

java - Mockito GregorianCalendate.getTime() 导致错误

javascript - 如何对服务中调用的过滤器进行单元测试

java - ZK如何一次显示300个列表头

java - Servlet web.xml 过滤器——未找到类异常