Questão nº 32
Questão de Tecnologia da Informação · FCC TRT15 2024 (nº 32)
Considere o seguinte trecho de código em Java, utilizando JUnit e Mockito para testar o comportamento de uma classe de serviço.
```java
public class PedidoService {
private final PedidoRepository pedidoRepository;
public PedidoService(PedidoRepository pedidoRepository) {
this.pedidoRepository = pedidoRepository;
}
public String processarPedido(String pedidoId) {
Optional<Pedido> pedido = pedidoRepository.buscarPorId(pedidoId);
if (pedido.isPresent() && pedido.get().isValido()) {
return "Pedido processado com sucesso";
} else {
return "Falha ao processar pedido";
}
}
}
@ExtendWith(MockitoExtension.class)
class PedidoServiceTest {
@Mock
private PedidoRepository pedidoRepository;
@InjectMocks
private PedidoService pedidoService;
@Test
void testeProcessarPedidoSucesso() {
Pedido pedidoMock = Mockito.mock(Pedido.class);
Mockito.when(pedidoMock.isValido()).thenReturn(false);
Mockito.when(pedidoRepository.buscarPorId("123")).thenReturn(Optional.of(pedidoMock));
String resultado = pedidoService.processarPedido("123");
Assertions.assertEquals("Pedido processado com sucesso", resultado);
}
}
```
Ao se executar o código em condições ideais, o teste
- Afalhará porque o método `buscarPorId` do `pedidoRepository` não foi chamado. É necessário usar o `verify` do Mockito para validar a interação.
- Bfalhará porque o mock de `Pedido` foi configurado para retornar `false` no método `isValido`, mas o caso de sucesso exige que ele retorne `true`. (alternativa correta)
- Cestá correto, mas o código da classe `PedidoService` está com erro na condição de validação, pois não considera o caso em que `isValido` retorna `false`.
- Dfalhará porque a string de comparação no `Assertions.assertEquals` está escrita incorretamente. A frase "Pedido processado com sucesso" deveria ser alterada para "Falha ao processar pedido".
- Efalhará porque o método `buscarPorId` do `pedidoRepository` não foi corretamente codificado para retornar um valor válido. É necessário corrigir o mock.
Resposta comentada
Gabarito Alternativa B
Testes de unidade com Mockito permitem simular o comportamento de dependências (objetos que uma classe usa) para isolar a classe sendo testada. O objetivo é garantir que a classe se comporta corretamente em diferentes cenários, configurando os "mocks" (simulações) para esses cenários.
(A) Incorreta: O método `buscarPorId` do `pedidoRepository` foi chamado e configurado para retornar um valor. O `verify` é usado para checar se um método foi chamado, mas a falha aqui não é por falta de chamada, e sim por uma lógica de retorno.
(B) Correta: O teste se chama `testeProcessarPedidoSucesso`, indicando que ele deveria testar o caminho de sucesso. Para que o `PedidoService` retorne "Pedido processado com sucesso", a condição `pedido.get().isValido()` precisa ser `true`. No entanto, o mock de `Pedido` (`pedidoMock`) foi configurado com `Mockito.when(pedidoMock.isValido()).thenReturn(false);`, fazendo com que a condição de sucesso seja falsa e o método retorne "Falha ao processar pedido", causando a falha na asserção.
(C) Incorreta: O código da classe `PedidoService` está correto em sua lógica. Ele explicitamente trata o caso onde `isValido` retorna `false` (ou o pedido não existe), retornando "Falha ao processar pedido". Não há erro na condição do serviço.
(D) Incorreta: A string de comparação no `Assertions.assertEquals` está correta para o que o teste pretende verificar (um cenário de sucesso). O problema não é a expectativa, mas a configuração do mock que impede que essa expectativa seja alcançada. A armadilha aqui é confundir a expectativa do teste com o resultado real causado pela configuração do mock. O teste quer validar o sucesso, então espera a mensagem de sucesso.
(E) Incorreta: O método `buscarPorId` do `pedidoRepository` foi corretamente mockado para retornar `Optional.of(pedidoMock)`, o que significa que um pedido foi encontrado. O problema não está na busca do pedido, mas na validade do pedido retornado.
Fonte: FCC TRT15 2024 Técnico Judiciário - Área Apoio Especializado - Especialidade Tecnologia da Informação (Caderno Tipo 001). Reproduzida para fins de estudo.