当前位置: 首页 > 知识库问答 >
问题:

@InjectMocks并不是真的注入模拟

宋翔
2023-03-14

所以我有一个类需要测试。我们把它叫做ClassToTest。它有两个Dao对象作为字段。

Public class ClassToTest {

    @Autowired
    MyDao dao;

    void methodToTest() {
        dao.save(something);
    }
}

正如您所看到的,ClassToTest不包含任何构造函数或setter,我正在使用spring自动关联字段。

现在,我有了一个具有classToTest所需的所有依赖项的基本测试类:

public abstract BaseTest {

    @Mock
    MyDao dao;

}

并且testClass扩展了这个BaseTest类:

public class TestClass extends BaseTest {

    @InjectMocks
    ClassToTest classToTest = new ClassToTest();

    @Before 
    public void setup() {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void test() {
        classToTest.methodToTest();
    }
}

这将导致保存时出现空指针异常。但是,如果我将设置方法更改为:

@Before 
public void setup() {
    MockitoAnnotations.initMocks(this);
    classToTest.dao = dao;
}

考试通过了。

我的理解是,当一个类没有构造函数或setter时,InjectMocks将通过使用字段注入来注入模拟。为什么这里没有发生这种事?

共有1个答案

谢俊力
2023-03-14

发现这是我使用的1.8.5版本中的错误:https://code.google.com/p/mockito/issues/detail?id=229.

升级1.10修复了这个问题。

 类似资料:
  • 注释InjectMocks为我们提供了存根/填充私有成员和重用测试用例的方法。这是我们填充假成员时发生问题的概念代码。 问题是当我们模拟假的组件B时。然后,someShimmedMethod将返回null。似乎InjectMock无法将

  • Mockito lib允许用@injectmock注入对象吗?我见过@Spy注释的例子,但当我试图使用它时,总是得到NullPointerException。我知道我总是可以直接使用reflect,但想法是避免这样的代码。

  • 当使用@InjectMocks时,它会自动尝试按照以下顺序进行注入:构造器、设置器、字段。它通过检查类型来检查是否可以在这些地方中注入,然后在有多种类型的可能性时命名。这对我来说不太好用,因为我的模拟映射锁实际上是通过它的setter注入到dontMockMe中的。我无法编辑此抽象类。有什么办法让我绕过塞特注射吗?提前谢谢!

  • 所以我有一个简单的java类: ClassA包含: B类: 我的测试设置如下所示: 问题是ClassB不是为ClassA注入的。 然后通过classA调用returnObject(ClassB),它返回NullPointerException(ClassB不是模拟/注入的)。 如果通过IWantToTestThisClass调用returObject(class B),则可以。 这是同时为两个类注

  • 在引导模式中是否有一个选项可以使它保持模式,即使用户点击离开模式?当用户在对话框外部单击时,模式对话框将隐藏。我希望它保持模态,直到用户单击关闭按钮。

  • 我有一个@sessionscoped bean,一个带有@stateless注释和@inject the bean和@ejb我的EJB的Restful Jersey服务。 当我试图从浏览器的URL调用rest web服务时,服务会注入@inject UserBean。但是当我试图从@SessionScoped UserBean中的代码调用web服务时,它不会被注入。 豆子: 1: Login fr