To co próbujesz zrobić to testowanie metody, która zwraca void co jest trochę trudniejsze od testowania metody, która coś zwraca. Jedyny sposób żeby przetestować taką metodę to veryfikacja mocka (co właściwie robisz, ale nie do końca poprawnie).
Tak powinien wyglądać test:
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.verify;
@RunWith(MockitoJUnitRunner.class)
public class CarRentalOptionsTest {
@Mock
private CarRentalStorage storage;
private CarRentalOptions carRentalOptions;
@Before
public void setUp() {
carRentalOptions = new CarRentalOptions(storage);
}
@Test
public void shouldAddClient() throws SQLException {
//given
Client client = new Client();
doNothing().when(storage).addClient(any(Client.class));
//when
carRentalOptions.createNewCustomer(client);
//then
verify(storage).addClient(eq(client));
}
}
A teraz opis:
testujesz metodę
carRentalOptions.createNewCustomer(client);
więc musisz zamokować zależności, które są wywoływane w tej metodzie, czyli storage.addClient(client):
void createNewCustomer(Client client) throws SQLException {
storage.addClient(client);
}
storage.addClient(client) (prawdopodobnie) zwraca void czyli nie możesz zamokować jej przez when
tylko tak:
doNothing().when(storage).addClient(any(Client.class));
I teraz veryfikacja mocka:
verify(storage).addClient(eq(client));
Co robi weryfikacja mocka: sprawdza czy w twojej testowanej metodzie createNewCustomer metoda, która jest wywoływana storage.addClient(client) otrzymuje jako parametr clent, który ustawiasz w teście.
W verify sprawdza się to używając matcher'a eq(client).
Pozostałe rzeczy które robisz:
List<Client> listOfClients = new ArrayList<Client>();
listOfClients.add(client);
when(carRentalStorageMock.getAllCustomers()).thenReturn(listOfClients);
assertEquals(1, listOfClients.size());
są niepotrzebne, getAllCustomers() w metodzie testowej nie jest wywoływane, więc niepotrzebnie to mokujesz. A lista, o której już pisałem, jest zwracana tylko w mocku, którego nie używasz .thenReturn(listOfClients), więc cały ten fragment jest niepotrzebny.
Rozumiem, że chcesz sprawdzić czy klient się zapisał, ale w ten sposób możesz to próbować robić w teście integracyjnym a nie jednostkowym, a to już inna historia...