【问题标题】:doNothing() not working with @Autowired fields mocked in SpringdoNothing() 不适用于 Spring 中模拟的 @Autowired 字段
【发布时间】:2012-10-12 13:56:08
【问题描述】:

我在测试类中自动装配了一个字段

@Autowired
private AbcDAO abcDAO;

并像这样使用它

doThrow(new RuntimeException()).when(abcDAO).methodName(xyz);

doNothing().when(abcDAO).methodName(xyz);

我在这样的 spring 文件中模拟了这个 DAO 类

<bean id="abcDAO" class="org.mockito.Mockito" factory-method="mock"  >
        <constructor-arg value="a.b.c.abcDAO" />
    </bean>

我收到NotAMockException Argument passed to when() is not a mock.

当我像这样使用`@Mock 注释时

@Mock
    private AbcDAO abcDAO;

直接在测试类中(而不是 @Autowiring 它并在 spring 中模拟),它工作正常。

为什么会这样?

编辑:

好的,那我来告诉你这样做的原因。

我们有一个服务 X,我想为“X”的 API 编写 junit。 Junits 的编写方式是我创建一个客户端并调用这些 API。我没有直接调用可以使用 @Mock 和 @Inject 模拟的方法。

我不确定是否清楚,但这是需要在 spring 文件中模拟时的用例。

【问题讨论】:

    标签: java spring junit mocking mockito


    【解决方案1】:

    看到这个答案:why-does-mockito-think-this-autowired-bean-is-null

    Mockito.mock 不是String,而是Class&lt;?&gt;。正如在另一个问题中所述。真的有充分的理由尝试在 Spring 上下文中创建模拟吗?

    【讨论】:

    • 如果您确实有充分的理由,为什么不使用springockito
    • 我也尝试了那里建议的方法。 但我又遇到了同样的错误。
    • 同样,不建议尝试这样做。我认为这是一种反模式。否则,请尝试 Alban 的 spingockito 建议。
    • 添加了这样做的原因。将调查springockito。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-21
    • 1970-01-01
    相关资源
    最近更新 更多