Class1 {
private Class2 class2;
public void f1() {
class2.f2();
}}
现在,我将Class2实例模拟注入了Class1实例。我需要编写一个测试来验证Class2 F2方法返回值。我该怎么做?
我明白您在测试中说您的class2
成员是一个模拟。如果是这样,则您不会测试模拟f2()
方法调用的返回值。由于这是一个模拟,您可以在模拟执行/返回所需的任何需要返回的方法上进行方法调用。验证这一点的方法是使用验证语句验证模拟对象的f2() m
ETHOD被调用。如果f2()
方法已经传递了参数,则还可以验证它是否已通过正确的参数调用。然后,您不必关心或担心它的返回是什么,因为您正在验证它的预期。您将在该类的单元测试中测试实际 f2()
方法,并且可以在该测试中验证它可以执行您的期望,但是在此处测试Class1,您只需要验证该方法已称为如预期的。
请参阅https://static.javadoc.io/org.mockito/mockito-core/2.13.0/org/mockito/mockito/mockito.html#1
使用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();
}
}