Próbuję pisać testy na API, tylko nowe na wiosnę i Mockito. Kiedy SaveAndflush, nie trafi do repo. Ten test przechodzi, gdy powinien zawieść, ponieważ na liście powinno być 1 konto. Jakikolwiek pomysł, czego tu brakuje?

public class AccountTest {
    @InjectMocks
    private AccountController underTest;
    @Mock
    private AccountRepository repo;
    private Account account = new Account();

    @BeforeEach
    void setUp() throws Exception{
        MockitoAnnotations.initMocks(this);
       account.setAccountNumber((long) 6666);
        account.setName("Steph");
        repo.saveAndFlush(account);
    }

      @Test
      void list(){
        List<Account> mockList = repo.findAll();
        when(underTest.list()).thenReturn(mockList);
        assert mockList != null;
        assertEquals(0, mockList.size());
    }
}
0
Stephanie Matheson 9 październik 2020, 18:20

1 odpowiedź

Najlepsza odpowiedź

W tym przypadku nie ma repozytorium: Mock jest obiektem udającym, że jest prawdziwym repozytorium, ale bez zapewniania żadnej funkcjonalności. Mockito gwarantuje, że makieta jest nazywana (jakby to był prawdziwy repozytorium), ale wszystkie metody nie robią nic (funkcje zwraca NULL lub puste listy, każda metoda pusta nic nie robi).

W przykładzie Findall () poprawnie zwraca pustą listę.

Chodzi o to, aby skonfigurować próbę symulować pewne zachowanie

# return a given object when the findById() method (any param) is called
when(repo.findById(isA(Long.class))).thenReturn(new Account());

I zweryfikować, że zachowuje się zgodnie z oczekiwaniami

# verify save() method is called once
verify(repo, times(1)).save(isA(Account.class));

W konkretnym przykładzie możesz móc findall (), jeśli twój test potrzebuje listy, która nie jest pusta

# return a list with one element
List<Account> list = Collections.singletonList(new Account())
when(repo.findAll().thenReturn(list);

// test something (for example the list is processed/manipulated by the controller
0
Beppe C 9 październik 2020, 15:49