【问题标题】:Mockito doReturn().when() calls original methodMockito doReturn().when() 调用原始方法
【发布时间】:2018-09-14 17:09:03
【问题描述】:

我无法让 Mockito 覆盖我正在测试的类中的方法。

@Test
public void test_classToTest() throws Exception {
    DependencyA dependencyA = mock(DependencyA.class);
    DependencyB dependencyB = mock(DependencyB.class);
    DependencyC dependencyC = mock(DependencyC.class);

    ClassToTest classToTest = ClassToTest.builder().dependencyA(dependencyA)
            .dependencyB(dependencyB).dependencyC(dependencyC).build();

    classToTest= Mockito.spy(classToTest);

    Mockito.doReturn("This is not the method you are looking for").when(classToTest).storeContent(null, null, null);

    String result = classToTest.copyContent(someVariable, SOME_CONSTANT);

我试图覆盖的方法是从 classToTest.copyContent() 内部调用的 classToTest.storeContent()。我知道这个类有点臭,但我无法重构它。但是,这不是一个非常复杂的设置,我不确定为什么会调用实际的 .storeContent() 方法。

【问题讨论】:

  • 您正在测试的方法的方法签名是什么?
  • 传递给真实方法的参数值是什么?也许用any()s 替换nulls?
  • 以上克里斯托弗的观点,请首先检查storeContentpublic、非static和非final,并且ClassToTest同样是public和非@ 987654329@。 (一般来说,我还建议不要在您正在测试的类上使用spy,而是将类作为一个单元进行测试,而不是孤立地梳理方法;我理解这种吸引力,但对于大多数类来说,它假设一些私有对测试不重要的类实现的详细信息。)

标签: java unit-testing testing junit mockito


【解决方案1】:

我建议不要使用null 参数来设置模拟的storeContent 方法,而是使用ArgumentMatchers.any

例如

import static org.mockito.ArgumentMatchers.*;

// ...

Mockito.doReturn("This is not the method you are looking for").when(classToTest).storeContent(any(), any(), any());

【讨论】:

  • 就是这样。谢谢!
【解决方案2】:

Mockito(和其他模拟工具)存在一个限制,即不能对 final 方法进行存根。

也许您的ClassToTest#storeContent 被标记为final

如果是这种情况,只需删除 final 关键字,存根机制就会启动。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多