java - 模拟链式调用

标签 java mockito

被测试的类是 TestedClass,它包含 InnerClass 类型中名为“inner”的字段。

Class TestedClass{

  InnerClass inner;

  public void methodToTest() {
     inner.getSomething().AddSomething(new Something());
  }
}

在我的测试中,我为“内部”创建了一个模拟,但无法弄清楚如何测试 methodToTest,我尝试过的所有选项要么不编译,要么从 Mockito 获取异常。模拟和测试此场景的正确方法是什么?

谢谢。

最佳答案

您应该在 TestedClass 初始化期间注入(inject) InnerClass 模拟。例如,您应该有一个构造函数:

class Something {
    void addSomething(Something sth) {
    }
}

class InnerClass {
    Something getSomething() {
        return new Something();
    }
}

class TestClass {

    private final InnerClass inner;

    TestClass(InnerClass inner) {
        this.inner = inner;
    }

    public void methodToTest() {
        inner.getSomething().addSomething(new Something());
    }
}

验证调用的测试将是:

@Test
public void shouldInvokeInnerClassMethod() {
    InnerClass innerMock = Mockito.mock(InnerClass.class);
    TestClass testSubject = new TestClass(innerMock);

    testSubject.methodToTest();

    verify(innerMock).getSomething();
}

如果您想测试传递给 addSometing 方法的值:

@Test
public void shouldAddSomething() {
    ArgumentCaptor<Something> somethingCaptor = ArgumentCaptor.forClass(Something.class);
    Something somethingMock = Mockito.mock(Something.class);
    InnerClass innerMock = Mockito.mock(InnerClass.class);
    when(innerMock.getSomething()).thenReturn(somethingMock);
    TestClass testSubject = new TestClass(innerMock);

    testSubject.methodToTest();

    verify(somethingMock).addSomething(somethingCaptor.capture());
    Something addedSomething = somethingCaptor.getValue();
    //assertions on addedSomething content
}

关于java - 模拟链式调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49507800/

相关文章:

java - 选择后如何处理图像?

java - Spring Boot + Hibernate JPA 延迟获取模式仍然查询实体中的列表

java - 在 Mockito.when 中多次使用相同的 ArgumentMatchers

junit - 当方法在 junit 中返回 null 时的 mockito

java - 如何为具有多个存储库的 IntelliJ 项目编写 Dockerfile?

java - 使用较新版本的 jna 库在 Glassfish 上运行 Web 应用程序

java - 具有自定义距离的层次聚类

java - 确定两个列表相等而不关心订购 Mockito

java - 使用mockito的空指针问题

java - Mockito void doAnswer 正确用法和目的