来自相同 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
。当代码难以测试时,可能需要对其进行更好的设计。
我正在尝试模拟一个函数,该函数被我正在尝试进行单元测试的其他函数调用。我目前正在使用以下代码,遵循 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
。当代码难以测试时,可能需要对其进行更好的设计。