【发布时间】:2021-05-26 06:01:33
【问题描述】:
我为某些服务编写单元测试,但我不明白,为什么我模拟的某些方法不调用。我尝试测试testDeleteDeviceWhenDeviceNotFound() 方法并且它通过了,但是当我尝试testDeleteDeviceSuccess() 时我遇到了问题
@Service
@Slf4j
@AllArgsConstructor
public class DeviceService {
private DeviceRepository deviceRepository;
private SyncSender syncSender;
public Mono<Void> deleteDevice(long deviceId) {
return deviceRepository
.findById(deviceId)
.switchIfEmpty(Mono.error(new NotFoundException()))
.flatMap(existingDevice -> deviceRepository
.delete(existingDevice)
.then(syncSender.sendDeviceDelete(existingDevice.getDeviceId()))
);
}
} 和我的测试
@ExtendWith(MockitoExtension.class)
class DeviceServiceTest {
@Mock
private DeviceRepository deviceRepository;
@Mock
private SyncSender syncSender;
@InjectMocks
private DeviceService deviceService;
@Test
@DisplayName("Test deleteDevice when NotFoundException")
void testDeleteDeviceWhenDeviceNotFound() {
long deviceId = 100L;
Mockito.when(deviceRepository.findById(deviceId)).thenReturn(Mono.empty());
Mono<Void> mono = deviceService.deleteDevice(deviceId);
StepVerifier
.create(mono)
.expectErrorMatches(throwable -> throwable instanceof NotFoundException)
.verify();
}
@Test
@DisplayName("Test deleteDevice success")
void testDeleteDeviceSuccess() {
DeviceModel deviceModel = createDeviceModel();
deviceModel.setDeviceId(100L);
Mockito.when(deviceRepository.findById(deviceModel.getDeviceId())).thenReturn(Mono.just(deviceModel));
Mockito.when(syncSender.sendDeviceDelete(anyLong())).thenReturn(Mono.empty());
Mockito.when(deviceRepository.delete(any(DeviceModel.class))).thenReturn(Mono.empty());
deviceService.deleteDevice(deviceModel.getDeviceId());
}
}
来自 junit 的异常,即在测试执行期间,在被测代码中从未实现存根方法之一
org.mockito.exceptions.misusing.UnnecessaryStubbingException:
Unnecessary stubbings detected.
Clean & maintainable test code requires zero unnecessary code.
Following stubbings are unnecessary (click to navigate to relevant line of code):
1. -> at com.ecosoft.dms.device.vending.service.DeviceServiceTest.testDeleteDeviceSuccess(DeviceServiceTest.java:172)
2. -> at com.ecosoft.dms.device.vending.service.DeviceServiceTest.testDeleteDeviceSuccess(DeviceServiceTest.java:173)
Please remove unnecessary stubbings or use 'lenient' strictness. More info: javadoc for UnnecessaryStubbingException class.
当我尝试调试模式时,我看到我在这一步返回。为什么?
.flatMap(existingDevice -> deviceRepository
【问题讨论】:
-
你是如何将你的设备存储库注入到服务中的?
-
是的,当然,我用 Mock DeviceRepository deviceRepository 模拟,用 ExtendWith(MockitoExtension.class) 模拟 testClass,用 InjectMocks DeviceService 服务模拟。当我评论 mocks syncSender.sendDeviceDelete 时,deviceRepository.delete 测试通过了。
-
请不要解释你是怎么做的,而是用相关代码更新你的问题
-
是的,我改了。
-
您是否阅读过 Javadoc 关于该主题的内容?异常本身会告诉您去哪里获取更多信息。上面写着
More info: javadoc for UnnecessaryStubbingException class。在 Web 上搜索“UnnecessaryStubbingException API”并阅读 Javadoc 以了解该异常。如果在阅读和尝试后您无法弄清楚,请返回并编辑此帖子,提供更具体的问题和详细信息。
标签: java unit-testing mockito spring-webflux spring-data-r2dbc