我有一个现有的类,我需要使用 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。有没有办法避免调用实际方法并仍然填充地图?
您需要向侦测对象注入模拟。
@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() {
// ...
}
}
参见将模拟注入间谍