Já tenho uma pequena experiência com testes unitários e só gostaria compartilhar com os colegas a possibilidade de utilizar as anotações do Mockito para criar os mocks, que ficam um pouquinho mais enxutos, o que ajuda bastante, principalmente em grandes classes de teste.
Breve explicação: para que as anotações funcionem é necessário "dizer" para o Mockito que irá utilizá-las. E isso é feito através do código.
public void setUp() {
MockitoAnnotations.openMocks(this);
}
A anotação @BeforeEach é do JUnit e faz com que tudo que está escrito no método que a recebe seja executado antes de cada teste.
A classe ficou assim:
class AbrigoServiceTest {
@Mock
private ClientHttpConfiguration client;
@InjectMocks
private AbrigoService abrigoService;
@Mock
private HttpResponse<String> response;
private final Abrigo abrigo = new Abrigo("Teste", "61981880392", "abrigo_alura@gmail.com");
@BeforeEach
public void setUp() {
MockitoAnnotations.openMocks(this);
}
@Test
void deveVerificarSeDispararRequisicaoGetSeraChamado() throws IOException, InterruptedException {
abrigo.setId(0L);
String expectedAbrigosCadastrados = "Abrigos cadastrados:";
String expectedIdENome = "0 - Teste";
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
PrintStream printStream = new PrintStream(byteArrayOutputStream);
System.setOut(printStream);
when(response.body()).thenReturn("[{" + abrigo.toString() + "}]");
when(client.dispararRequisicaoGet(anyString())).thenReturn(response);
abrigoService.listarAbrigo();
String[] lines = byteArrayOutputStream.toString().split(System.lineSeparator());
String actualAbrigosCadastrados = lines[0];
String actualIdENome = lines[1];
Assertions.assertEquals(expectedAbrigosCadastrados, actualAbrigosCadastrados);
Assertions.assertEquals(expectedIdENome, actualIdENome);
}
}
O @Mock cria objetos mocados do mesmo tipo que o campo que está em cima; O@InjectMocks cria uma instância do objeto em que está em cima, já inserindo os mocks que o objeto necessita.