Spy 实际方法调用,无法通过 mocking 存根实际方法中的调用

问题描述 投票:0回答:1

我有一个现有的类,我需要使用 Junit 和 Mockito 为其编写单元测试用例。 我正在尝试测试的方法调用另一个类的方法,该方法不返回任何内容,而是填充一个作为参数传递给方法调用的 Map。 我正在使用 @Spy 调用实际方法,因为我想在我的测试方法中获取 Map 以供进一步使用。但是被调用的实际方法依赖于另一个 Utility 类,我试图使用 @Mock 模拟该类的行为,但 Utility 类没有被模拟,我得到了一个 NPE。 有人可以帮忙解决在这种情况下需要做的事情吗?

public class MyClass {
  
  public Response method() {//Method to be tested
    Map<String, Object> mapToBePopulated = new HashMap<>();
    supportClass.populateMap(mapToBePopulated);
  }
}
public class SupportClass {
  @Autowired
  UtilityClass utility;

  public void populateMap(Map<String, List<Object>> mapToBePopulated) {
    //populateMap
    utility.doSomething(mapToBePopulated); //I'm mocking Utility class but when the debugger comes to this line the utility object is Null which throws the NPE.
  }
  //this method is being stubbed
  public Object doSomething(String one) {
  //some lines
  }
}

编辑:添加了其他方法,这些方法是我正在存根的 SupportClass 的一部分,所以不能在这里真正使用 @InjectMocks。有没有办法避免调用实际方法并仍然填充地图?

java unit-testing mockito spy
1个回答
0
投票

您需要向侦测对象注入模拟。

@ExtendWith(MockitoExtension.class)
public class MyClassTest {

    private MyClass myClass;

    @Mock
    private UtilityClass utilityClassMock;

    @InjectMocks
    private SupportClass supportClassSpy;

    @BeforeEach
    public void setUp() {
        supportClassSpy = Mockito.spy(new SupportClass());
        myClass = new MyClass(supportClassSpy);
    }

    @Test
    public void yourTest() {
        // ...
    }

}

参见将模拟注入间谍

© www.soinside.com 2019 - 2024. All rights reserved.