我有一个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接口的单元测试用例。
发布于 2017-08-25 14:13:48
听起来你在这里混淆了一些细节,因为如果没有进一步的细节,“模拟测试用例”这个词就没有多大意义了……
首先,假设您的接口有三个实现,那么最佳实践是测试所有这三个实现。
只要您的实现没有依赖项,就根本不涉及模仿,因为...
其次,mocking用于测试依赖项。例如:
您的实现#2必须从数据库加载数据。为此,它使用了一个类的实例,我们称它为DatabaseAccessor。通过调用此DatabaseAccessor对象的方法,它可以从数据库中获取数据。
现在,如果您想要对实现#2进行单元测试,您实际上并不想为此而需要一个数据库,因为这样做会遇到很多问题。例如,如果数据库关闭或处于不正确的状态,那么您的测试将失败,即使您实际上想要测试的实现#2是完全正常的。
这就是模仿的用武之地。您不是使用实际的DatabaseAccessor对象,而是模拟一个对象。换句话说,您创建了一个看起来像DatabaseAccessor但实际上并不访问数据库的对象。可以配置这样一个mock的行为,例如,如果调用了一个方法,mock将返回一些有用的测试数据(同样,实际上没有调用数据库,您只需告诉它“如果调用了方法X,就执行此操作”)。
这样,您就可以专注于只测试您的单元--实现#2 --而不必担心它的所有依赖项。这些都是被嘲笑的,你知道,他们会表现得像他们应该的那样。
是的,使用Mockito可以模拟实现和接口,但最佳实践是无论如何都要使用接口。对于进一步的问题,我建议提供更多关于您的课程的详细信息。
发布于 2017-08-26 21:04:42
让我们转向一个更面向对象的讨论。假设我们编写一个Car接口,它有一个类似putFuel的方法,
interface Car {
void putFuel(FuelStation fs);
}现在我想出三个版本的cars -PetrolCar实现Car -DieselCar实现Car -CNGCar实现Car
现在,putFuel()方法对于每个实现都有很大的不同,例如加油站、柴油站和CNG站,以及它们的模拟相关依赖项。
因此,我应该为所有的实现编写测试用例,因为每个实现都是不同的。还要考虑到,在未来,所有实现都可能具有接口可能没有的不同方法,因此为每个实现编写单独的单元测试用例是非常有意义的。
发布于 2017-08-25 12:46:20
单元测试是为测试类的功能而编写的。接口只有空方法。您应该为每个类编写测试。
https://stackoverflow.com/questions/45874049
复制相似问题