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 为接口或每个实现编写单元测试?_Java_Unit Testing_Mockito - Fatal编程技术网

Java 为接口或每个实现编写单元测试?

Java 为接口或每个实现编写单元测试?,java,unit-testing,mockito,Java,Unit Testing,Mockito,我有一个Java接口和几个实现。现在我想用Mockito编写单元测试用例 我的问题是,我应该为每个实现编写模拟测试用例,还是只为接口编写模拟测试用例?这种情况下的最佳实践是什么?我希望我的问题有意义。如果我遗漏了什么,请纠正我 课程详情: interface MessageQueue { add() poll() size() } class InMemoryMessageQueue implements MessageQueue { add() {

我有一个Java接口和几个实现。现在我想用Mockito编写单元测试用例

我的问题是,我应该为每个实现编写模拟测试用例,还是只为接口编写模拟测试用例?这种情况下的最佳实践是什么?我希望我的问题有意义。如果我遗漏了什么,请纠正我

课程详情:

interface MessageQueue {
    add()
    poll()
    size()
}

class InMemoryMessageQueue implements MessageQueue {
    add() {
        //implementation
    }
    poll() {
        //implementation
    }
    size() {
        //implementation
    }
}

class FileSystemMessageQueue implements MessageQueue {
    add() {
        //implementation
    }
    poll() {
        //implementation
    }
    size() {
        //implementation
    }
}

目前,我只有使用Mockito的MessageQueue接口的单元测试用例

编写单元测试是为了测试类的功能。接口只有空方法。您应该为每个类编写测试。

编写单元测试是为了测试类的功能。接口只有空方法。您应该为每个类编写测试。

这里听起来您混淆了一些细节,因为如果没有进一步的细节,mock test case这个词就没有什么意义了

首先,如果您有三种接口实现,那么最好的做法是测试这三种实现

只要您的实现没有依赖项,就根本不需要模拟,因为

其次,模拟用于测试依赖项。例如:

实现2必须从数据库加载数据。为此,它使用一个类的实例,我们称之为DatabaseAccessor。通过调用此DatabaseAccessor对象的方法,它从数据库中获取数据

现在,如果您想对实现2进行单元测试,您实际上不想为此需要一个数据库,因为这会带来很多问题。例如,如果数据库已关闭或处于不正确的状态,则测试将失败,即使您实际想要测试的实现2非常好

这就是嘲弄的用武之地。不使用实际的DatabaseAccessor对象,而是模拟一个。换句话说,您创建了一个看起来像DatabaseAccessor但实际上不访问Ddtabase的对象。可以配置这样一个模拟的行为,例如,如果调用了一个方法,模拟将再次返回一些有用的测试数据,而不实际调用数据库,您只需告诉它如果调用了方法X,就可以执行此操作

通过这种方式,您可以只专注于测试单元(实现2),而不必担心它的所有依赖性。这些都是被嘲笑的,你知道,他们会表现得像他们应该表现的那样


是的,使用Mockito可以模拟实现和接口,但最佳实践是无论如何使用接口。对于进一步的问题,我建议您提供更多关于您的类的详细信息。

听起来您在这里混淆了一些细节,因为没有进一步的详细信息,“模拟测试用例”一词就没有多大意义

首先,如果您有三种接口实现,那么最好的做法是测试这三种实现

只要您的实现没有依赖项,就根本不需要模拟,因为

其次,模拟用于测试依赖项。例如:

实现2必须从数据库加载数据。为此,它使用一个类的实例,我们称之为DatabaseAccessor。通过调用此DatabaseAccessor对象的方法,它从数据库中获取数据

现在,如果您想对实现2进行单元测试,您实际上不想为此需要一个数据库,因为这会带来很多问题。例如,如果数据库已关闭或处于不正确的状态,则测试将失败,即使您实际想要测试的实现2非常好

这就是嘲弄的用武之地。不使用实际的DatabaseAccessor对象,而是模拟一个。换句话说,您创建了一个看起来像DatabaseAccessor但实际上不访问Ddtabase的对象。可以配置这样一个模拟的行为,例如,如果调用了一个方法,模拟将再次返回一些有用的测试数据,而不实际调用数据库,您只需告诉它如果调用了方法X,就可以执行此操作

通过这种方式,您可以只专注于测试单元(实现2),而不必担心它的所有依赖性。这些都是被嘲笑的,你知道,他们会表现得像他们应该表现的那样


是的,使用Mockito可以模拟实现和接口,但最佳实践是无论如何使用接口。对于进一步的问题,我建议提供更多关于类的详细信息。

让我们转到更面向对象的讨论。 假设我们写一个汽车接口,它有一个方法,比如

interface Car {
    void putFuel(FuelStation fs);
}
现在我想出了三个版本的汽车 -PetrolCar工具车 -柴油车 -CNGCar工具车

现在,putFuel方法对于每个实施都会有很大的不同,例如加油站、柴油站和CNG站,以及它们与模拟相关的依赖关系

因此 e、 我应该为所有实现编写测试用例,因为每个实现都是不同的。
此外,考虑到将来所有的实现都可能有不同的接口可能不存在的方法,因此为每个实现编写单独的单元测试用例是完全有意义的。 假设我们写一个汽车接口,它有一个方法,比如

interface Car {
    void putFuel(FuelStation fs);
}
现在我想出了三个版本的汽车 -PetrolCar工具车 -柴油车 -CNGCar工具车

现在,putFuel方法对于每个实施都会有很大的不同,例如加油站、柴油站和CNG站,以及它们与模拟相关的依赖关系

因此,我应该为所有实现编写测试用例,因为每个实现都是不同的。
此外,考虑到将来所有的实现都可能有不同的接口可能不存在的方法,因此为每个实现编写单独的单元测试用例是完全有意义的。如果是前者,则不需要模拟任何东西,除非存在其他依赖项;如果是后者,则在需要接口实现的地方使用mock。正如您提到的,您有一个接口的多个实现,如果您想测试所有不同的实现,则建议为每个实现编写测试用例。因为我使用Mockito,我认为模拟接口或实现没有区别,对吗?。mockito单元测试用例在接口和实现方面运行良好,没有任何更改。那么为什么我应该在所有实现测试中都有重复的代码呢?请使用mockito.发布一个仅针对MessageQueue接口的单元测试用例,让我们了解您在这里做什么。您是在尝试测试实现该接口的类,还是其他什么?如果是前者,则不需要模拟任何东西,除非存在其他依赖项;如果是后者,则在需要接口实现的地方使用mock。正如您提到的,您有一个接口的多个实现,如果您想测试所有不同的实现,则建议为每个实现编写测试用例。因为我使用Mockito,我认为模拟接口或实现没有区别,对吗?。mockito单元测试用例在接口和实现方面运行良好,没有任何更改。那么为什么我在所有实现测试中都应该有重复的代码呢?请使用mockito.发布一个仅针对MessageQueue接口的单元测试用例,让我们了解您在这里做什么。请使用mockito.发布一个仅针对MessageQueue接口的单元测试用例。,请使用mockito.发布一个仅用于MessageQueue接口的单元测试用例,让我们了解您在这里做什么。