Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Mockito中存根方法时,我应该使用原始实例还是存根实例进行测试?_Java_Unit Testing_Mockito - Fatal编程技术网

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容器。你没有分离关注点。使用一个注入的、可模仿的抽象工厂,你会发现。