es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Funciones de Mock de JUnit5 de Quarkus desde la misma clase

Estoy tratando de simular una función que es llamada por otra función que estoy tratando de probar unitariamente. Actualmente estoy usando el siguiente código, siguiendo las sugerencias dadas aquí:

@QuarkusTest
public class SampleServiceTest {
    @Inject
    SampleService sampleService;

    @Test
    public void testFindById() {
        // Given
        final Sample sample = SampleDataProvider.createSample();
        final SampleResponse expectedResponse = SampleDataProvider.createSampleResponse();
        MockedStatic<sampleresponseassembler> mockedStatic = mockStatic(SampleResponseAssembler.class);

        // When
        doReturn(sample).when(sampleService).findSampleById(SampleDataProvider.ID);
        mockedStatic.when(() -> SampleResponseAssembler.fromSample(sample)).thenReturn(expectedResponse);
        final SampleResponse sampleResponse = sampleService.findById(SampleDataProvider.ID);

        // Then
        verify(sampleService, times(1)).findSampleById(SampleDataProvider.ID);
        mockedStatic.verify(() -> SampleResponseAssembler.fromSample(sample), times(1));
        assertEquals(expectedResponse, sampleResponse);
    }
}

Las funciones que se están probando:

public SampleResponse findById(final UUID id) {
    LOGGER.debug("findById. id={}", id);
    return SampleResponseAssembler.fromSample(findSampleById(id));
}

public Sample findSampleById(final UUID id) {
    LOGGER.debug("findSampleById. id={}", id);
    final Optional<sample> optionalSample = sampleRepository.findById(id);
    return optionalSample
            .orElseThrow(() -> new NotFoundException(NotFoundException.NotFoundErrorMessage.SAMPLE_ID,
                    id.toString()));
}

Básicamente quiero poder simular la función findSampleById. Ya realicé este cambio y funcionó correctamente, pero “initMocks” está en desuso, por lo que necesito otra solución:

“`java
@Spy
@InjectMocks
SampleService sampleService;

@Mock
SampleRepository sampleRepositoryMock;

@BeforeEach
void setUp() {
MockitoAnnotations.initMocks(this);
}
“`

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para simular la función findSampleById que es llamada por findById durante las pruebas unitarias, se puede utilizar Mockito para simular las dependencias de la clase que está siendo probada. Primero, se crea una simulación (mock) de la interfaz SampleRepository e inyectarla en la clase SampleService. Luego, se utiliza when y thenReturn de Mockito para definir el comportamiento del mock sampleRepository cuando se llama el método findSampleById. Aquí tienes un ejemplo de código:

    // Dado
    final Sample sample = SampleDataProvider.createSample();
    final SampleResponse expectedResponse = SampleDataProvider.createSampleResponse();
    SampleRepository sampleRepositoryMock = mock(SampleRepository.class);
    SampleService sampleService = new SampleService(sampleRepositoryMock);
    
    // Cuando
    when(sampleRepositoryMock.findById(SampleDataProvider.ID)).thenReturn(Optional.of(sample));
    final SampleResponse sampleResponse = sampleService.findById(SampleDataProvider.ID);
    
    // Entonces
    verify(sampleRepositoryMock, times(1)).findById(SampleDataProvider.ID);
    assertEquals(expectedResponse, sampleResponse);
    

    En este ejemplo, estamos simulando el SampleRepository e inyectando el objeto de simulación en SampleService, que es la clase que está siendo probada. Luego, definimos el comportamiento de la simulación sampleRepository usando when y thenReturn. Cuando se llama el método findById con el argumento SampleDataProvider.ID, devolverá un Optional que contiene el objeto sample. Finalmente, llamamos al método findById en sampleService y verificamos que sampleRepositoryMock sea llamado exactamente una vez con el argumento correcto, y que se devuelve la respuesta esperada.

Comments are closed.