编写一个over摩托测试以验证class1方法返回值中调用的类方法


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();
    }
}

相关内容

  • 没有找到相关文章

最新更新