被测试的类是 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/