我想通过模拟外部依赖关系为每个测试用例返回不同的结果来测试方法中的一些情况。但是when总是返回第一次定义的内容(在此示例中-空集),这破坏了下一个测试。
如果我一个人一个地运行测试,则它们成功通过,但是当我运行整个类时,只有第一个测试通过,而其他则失败。

测试班:

class ExampleTest {

    @Mock
    private Dao dao;

    @Mock
    private Validator validator;

    @Spy
    @InjectMocks
    Controller controller;

    @BeforeEach
    void setUp() {
        initMocks(this);
    }

    private final static Set DATA = Set.of("data1", "data2");

    @Test
    void firstTest() throws UserDashboardException, DashboardException, WidgetException {
        when(validator.filter(DATA)).thenReturn(Collections.emptySet());

        assertThrows(Exception.class, () -> controller.create(DATA));
    }

    @Test
    void secondTest() throws UserDashboardException, DashboardException, WidgetException {
        when(validator.filter(DATA)).thenReturn(DATA);

        controller.create(DATA);

        verify(dao, times(1)).create(eq(DATA));
    }

}


经过测试的课程:

public class Controller {

    private Dao dao;
    private Validator validator;

    public Controller(Dao dao,Validator validator) {
        this.dao = dao;
        this.validator = validator;
    }

    public String create(Set<String> data) {
        data = validator.filter(data);

        if (data.isEmpty()) {
            throw new Exception("Invalid data.");
        }

    return dao.create(data);
    }
}


因此,在两个测试中,create方法都会引发异常,这不是我期望的。也许我错过了一点?

最佳答案

您是否尝试过doReturn方法?

doReturn(DATA).when(validator).filter(DATA)


可以从org.mockito.Mockito.doReturn导入;

编辑:您的代码实现中可能存在错误:

data = validator.filter(data);

10-07 19:17
查看更多