如何使用 Mockito 在 class 中模拟 @injected 对象?

How to mock @injected object in class using Mockito?

我有以下 Java 代码:


文件名:MyClass.java


import javax.inject.Inject;
...

public class MyClass {
  @inject
  private MyDatabaseDao myDatabaseDao;

  public MyResponse process() {
    ...
    String value = myPrivateMethod(x, y, z);
    ...
  }

  private String myPrivateMethod(String x, String y, String z) {
    value = myDatabaseDao.operation(x, y, x); // Line Number 86
    ...
  }  
}

文件名:MyClassTest.java

@ExtendWith(MockitoExtension.class)
public class MyClassTest {
  @InjectMocks
  MyClass myClass;

  @Mock
  MyDatabaseDao myDatabaseDao;

  @Test
  void testProcess() {
    ...

    Mockito.when(myDatabaseDao.operation(any(), any(), any()))
                .thenReturn(someValue);
    ...
    assertEquals(testResponse, myClass.process());    
  }
}

我在 MyClass.java 的第 86 行中得到一个 nullPointerException,即该行中的 myDatabaseDao 对象为空。我怎样才能正确模拟并传递该对象?

我正在使用 JUnit 5 和 Mockito v4.2.0

我相信是因为你忘记注册了MockitoExtension。要使 @Mock@InjectMocks 生效,您必须注册它:

@ExtendWith(MockitoExtension.class)
public class MyClassTest {

  @InjectMocks
  MyClass myClass;

  @Mock
  MyDatabaseDao myDatabaseDao;

}