简体   繁体   中英

First mock of the method applied always

I want to test a few cases in a method by mocking external dependency to return different results for every test case. But when always returns what is defined at first time (in this example - empty set) and that brokes the next tests. If I run tests one by one they pass successfully but when I run the whole class only the first test pass and others fail.

Testing class:

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

}

Tested class:

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

So, in both tests create method throws an exception which is not what I expect. Maybe I miss some point?

Have you tried with doReturn method?

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

which can be import from org.mockito.Mockito.doReturn;

Edited: there might be a bug inside your code implementation:

data = validator.filter(data);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM