【问题标题】:How to mock @injected object in class using Mockito?如何使用 Mockito 在课堂上模拟 @injected 对象?
【发布时间】:2022-01-30 17:17:47
【问题描述】:

我有以下 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

【问题讨论】:

  • 上面的代码可以正常工作。在我的情况下它不起作用,因为我有一些剩余的代码正在创建一个新的 MyClass 对象(我忽略了这一点在清理代码时)。

标签: java mockito junit5


【解决方案1】:

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

@ExtendWith(MockitoExtension.class)
public class MyClassTest {

  @InjectMocks
  MyClass myClass;

  @Mock
  MyDatabaseDao myDatabaseDao;

}

【讨论】:

  • 哎呀,我的错,我的代码中有注释@ExtendWith(MockitoExtension.class),但忘记在上面的问题中添加它。即使有注释,我也会得到 NPE。
  • 不知道。它应该工作。或者您尝试在MyClass 中添加一个构造函数,输入参数为MyDatabaseDao
  • 感谢您的帮助,是的,代码有效。我在清理过程中留下了一些不需要的代码,我忽略了这些代码并导致了问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-24
  • 1970-01-01
  • 2020-11-30
  • 1970-01-01
相关资源
最近更新 更多