我正在嘗試模擬由我正在嘗試進行單元測驗的其他函式呼叫的函式。我目前正在使用以下代碼,遵循此處給出的建議:
@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);
}
uj5u.com熱心網友回復:
使用@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. 當代碼難以測驗時,可能需要對其進行更好的設計。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/402188.html
