Class1 {
private Class2 class2;
public void f1() {
class2.f2();
}}
现在我将Class2实例模拟注入到Class1实例中。 我需要编写一个测试来验证Class2 f2方法的返回值。 我该怎么做?
答案 0 :(得分:0)
我理解你要说的是,在你的测试中,你的class2
成员是一个嘲笑者。如果是这样,那么您就不会测试模拟f2()
方法调用的返回值。因为它是一个模拟,你可以在模拟执行/返回任何你需要它返回的方法调用。验证这一点的方法是使用verify语句来验证是否调用了模拟对象的f2() m
方法。如果已传递f2()
方法参数,您还可以验证是否已使用传递的正确参数调用它。然后,您不必关心或担心它返回的内容,因为您正在验证它是否按预期调用。您将在该类的单元测试中测试实际 f2()
方法,并且可以在该测试中验证它是否符合您的预期,但是您在测试Class1时只需要验证该方法按预期调用。
请参阅https://static.javadoc.io/org.mockito/mockito-core/2.13.0/org/mockito/Mockito.html#1
答案 1 :(得分:0)
使用Mockito.spy和Whitebox的组合断言调用了委托引用。
import org.junit.Test;
import org.mockito.Mockito;
import org.mockito.internal.util.reflection.Whitebox;
public class MockitoSpy {
public class ClassTwo {
public void doAThing(){}
}
public class ClassOne {
private ClassTwo clazz2 = new ClassTwo();
public void invokeClassTwo() {
clazz2.doAThing();
}
}
@Test
public void testDelegationCall() {
//Create the Object that will be our Spy
ClassTwo twoRef = new ClassTwo();
//Make the actual SPY reference
ClassTwo spy = Mockito.spy(twoRef);
//Configure the spy to not invoke the actual code -- that's not what we're testing.
Mockito.doNothing().when(spy).doAThing();
//Create the Object we want to test.
ClassOne testInstance = new ClassOne();
//Replace the field named 'clazz2' in the testInstance with our Spy
Whitebox.setInternalState(testInstance, "clazz2", spy);
//Make the call to the testInstance
testInstance.invokeClassTwo();
//ASSERT that the spy was called the number of times we would have expected
Mockito.verify(spy, Mockito.times(1)).doAThing();
}
}