编写Mockito测试以验证在Class1方法返回值中调用的Class2方法

时间:2017-12-07 14:18:42

标签: junit mockito

Class1 {
    private Class2 class2;
    public void f1() {
      class2.f2();
    }}

现在我将Class2实例模拟注入到Class1实例中。 我需要编写一个测试来验证Class2 f2方法的返回值。 我该怎么做?

2 个答案:

答案 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();

    }

}