gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 11:14:54 24 4
gpt4 key购买 nike

我正在尝试使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com