Return 测试中的预期值列表

Return expected list of values in test

这是一个带有测试(junit5+mockito)的虚拟代码。如何在单元测试中强制执行 return 预期值列表? 我尝试使用 spy()、mock(),但我没有得到预期的值,或者有时我得到空指针异常。

class A {
}

public interface B {
    public List<A> f1();
}

class X {
    B o1;
    public X(B y) {
        o1 = y;
    }

    protected void x() {
        List<A> results = m1();
        // ...
    }
    protected List<A> m1() {
        return o1.f1();
    }
}

class XTest {
    @Mock
    private static B b;

    @BeforeAll
    public static void setUp() {
        b = org.mockito.Mockito.mock(B.class);
    }

    @Test
    public void t1() {
        X s = spy(new X(b));

        A p = new A();
        A r = new A();
        List<A> c = Arrays.asList(p, r);
        when(s.m1()).thenReturn(c);         // how to enforce m1() to return c ?
    }
}

尝试使用 doReturn,像这样:

public class XTest {

    @Mock
    private B b;

    @Test
    public void t1() {
        X s = spy(new X(b));
        List<A> list = Arrays.asList(new A(), new A());
        doReturn(list).when(s).m1();

        //
        doSomething
    }
}

你测试 class X 并为此模拟 class B. 永远不要模拟你想测试的 class:

class XTest {

    private static B b;

    @BeforeAll
    public static void setUp() {
        b = org.mockito.Mockito.mock(B.class);
    }

    @Test
    public void t1() {
        X s = new X(b);

        A p = new A();
        A r = new A();
        List<A> c = Arrays.asList(p, r);
        when(b.f1()).thenReturn(c);         //  m1() calls f1 and returns c 
    }
}