繁体   English   中英

模拟链接的电话

[英]Mocking chained calls

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

Class TestedClass{

  InnerClass inner;

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

在我的测试中,我为“内部”创建了一个模拟程序,并且无法弄清楚如何测试methodToTest,我尝试过的所有选项都无法编译,并从Mockito中获取异常。 模拟和测试这种情况的正确方法是什么?

谢谢。

您应该在TestedClass初始化期间注入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
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM