Java 在Mockito中存根方法时,我应该使用原始实例还是存根实例进行测试?
我有一个要测试的服务方法:Java 在Mockito中存根方法时,我应该使用原始实例还是存根实例进行测试?,java,unit-testing,mockito,Java,Unit Testing,Mockito,我有一个要测试的服务方法: public ScheduleView createSchedule(ScheduleView scheduleView) throws ValidationException { scheduleView = (ScheduleView) createObject(scheduleView, ScheduleBean.class); sendNotificationScheduleDataChangedToSchedulerDaemon();
public ScheduleView createSchedule(ScheduleView scheduleView) throws ValidationException {
scheduleView = (ScheduleView) createObject(scheduleView, ScheduleBean.class);
sendNotificationScheduleDataChangedToSchedulerDaemon();
return scheduleView;
}
sendNotificationScheduledDataChangedToSchedulerDaemon()
方法连接到名为ServerService的远程服务,这不是单元测试期间所需的。单元测试期间远程服务未运行,因此连接失败。我最好使用Mockito来存根这个方法,这样它就不会被调用:
public void testCRUOperations() {
// Create the service
ScheduleService scheduleService = (ScheduleService) ServiceFactory.getInstance().createService(ScheduleService.class);
ScheduleService scheduleServiceSpy = spy(ScheduleService.class);
doNothing().when(scheduleServiceSpy).sendNotificationScheduleDataChangedToSchedulerDaemon();
现在,我的问题是,我应该如何调用createSchedule()方法以使存根方法不被执行
scheduleView = scheduleService.createSchedule(newscheduleView);
或
我已经尝试了这两种方法,但是stubbed方法仍然会被执行,并且我的日志中仍然会出现ConnectException
我在这里以及Mockito框架网站上查看了其他问题,但我无法理解。什么是存根方法的正确方法?注释太长,请将其放在此处
我不确定是否有存根,但其他一切似乎都表明应该进行重构。这个问题清楚地表明,所讨论的方法或与之交互的对象是紧密耦合的,应该抽象为可注入的依赖关系
public interface NotificationService {
void sendNotificationScheduleDataChangedToSchedulerDaemon();
}
public class ScheduleService {
private NotificationService notificationService;
public ScheduleService(NotificationService notificationService) {
this.notificationService = notificationService;
}
public ScheduleView createSchedule(ScheduleView scheduleView) throws ValidationException {
scheduleView = (ScheduleView) createObject(scheduleView, ScheduleBean.class);
notificationService.sendNotificationScheduleDataChangedToSchedulerDaemon();
return scheduleView;
}
}
依赖项现在可以在单元测试期间模拟,这样它就不会影响实际的服务,具体的实现将在生产代码中使用。注释太长了,所以将其放在这里
我不确定是否有存根,但其他一切似乎都表明应该进行重构。这个问题清楚地表明,所讨论的方法或与之交互的对象是紧密耦合的,应该抽象为可注入的依赖关系
public interface NotificationService {
void sendNotificationScheduleDataChangedToSchedulerDaemon();
}
public class ScheduleService {
private NotificationService notificationService;
public ScheduleService(NotificationService notificationService) {
this.notificationService = notificationService;
}
public ScheduleView createSchedule(ScheduleView scheduleView) throws ValidationException {
scheduleView = (ScheduleView) createObject(scheduleView, ScheduleBean.class);
notificationService.sendNotificationScheduleDataChangedToSchedulerDaemon();
return scheduleView;
}
}
现在可以在单元测试期间模拟依赖关系,这样它就不会影响实际的服务,具体的实现将在生产代码中使用。我不确定存根是否正确,但一切似乎都表明应该进行重构。这个问题清楚地表明,所讨论的方法应该抽象为一个可注入的依赖项。我不知道为什么在您将
sendNotificationScheduledDataChangedToSchedulerDamon
方法存根后仍然调用它。它是最终的还是私有的?我不确定存根是什么,但一切似乎都表明应该进行重构。这个问题清楚地表明,所讨论的方法应该抽象为一个可注入的依赖项。我不知道为什么在您将sendNotificationScheduledDataChangedToSchedulerDamon
方法存根后仍然调用它。它是最终的还是私有的?我完全同意,但是,我们使用工厂模式(ServiceFactory.getInstance().createService(ScheduleService.class)
),并且服务器服务本身具有ServiceFactory.getInstance()调用的额外参数,因此,必须按照您的建议注入服务意味着我们调用ScheduleService方法的类失去了关注点分离。服务工厂不够聪明,无法识别它所创建的服务的依赖关系?你应该研究依赖注入。服务工厂可以充当你的IoC容器。你没有分离关注点。使用一个可注入和模拟的抽象工厂,你会的。但是,我完全同意,我们使用工厂模式(ServiceFactory.getInstance().createService(ScheduleService.class)
),服务器服务本身有ServiceFactory.getInstance()调用的额外参数,因此,必须按照您的建议注入服务意味着我们调用ScheduleService方法的类失去了关注点分离。服务工厂不够聪明,无法识别它所创建的服务的依赖关系?你应该研究依赖注入。服务工厂可以充当你的IoC容器。你没有分离关注点。使用一个注入的、可模仿的抽象工厂,你会发现。