来自相同 class 的 Quarkus Junit5 模拟函数

Quarkus Junit5 mock functions from the same class

我正在尝试模拟一个函数,该函数被我正在尝试进行单元测试的其他函数调用。我目前正在使用以下代码,遵循 here:

给出的建议
@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);
    }
}

正在测试的功能:

    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()));
    }

我基本上希望能够模拟 findSampleById 函数。我已经做了这个更改并且它工作正常但是“initMocks”已被弃用所以我需要另一个解决方案:

    @Spy
    @InjectMocks
    SampleService sampleService;

    @Mock
    SampleRepository sampleRepositoryMock;

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

使用 @ExtendWith(MockitoExtension.class) 而不是 @QuarkusTest

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Spy;
import org.mockito.runners.MockitoJUnitRunner;

@ExtendWith(MockitoExtension.class)
class SampleServiceTest {

    @Spy
    @InjectMocks
    SampleService sampleService;

    @Mock
    SampleRepository sampleRepositoryMock;

    @BeforeEach
    void setUp() {
        // Not needed
    }

    @Test
    void testFindById() {
        // ...
    }
}

此外,IMO,如果我们必须模拟 findSampleById 来测试 findById,您应该将它们分成两个 类 而不是使用 @Spy。当代码难以测试时,可能需要对其进行更好的设计。