首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为接口或每个实现编写单元测试?

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

Stack Overflow用户
提问于 2017-08-25 11:34:12
回答 3查看 3.3K关注 0票数 4

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

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

类详细信息:

代码语言:javascript
复制
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接口的单元测试用例。

EN

回答 3

Stack Overflow用户

发布于 2017-08-25 14:13:48

听起来你在这里混淆了一些细节,因为如果没有进一步的细节,“模拟测试用例”这个词就没有多大意义了……

首先,假设您的接口有三个实现,那么最佳实践是测试所有这三个实现。

只要您的实现没有依赖项,就根本不涉及模仿,因为...

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

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

现在,如果您想要对实现#2进行单元测试,您实际上并不想为此而需要一个数据库,因为这样做会遇到很多问题。例如,如果数据库关闭或处于不正确的状态,那么您的测试将失败,即使您实际上想要测试的实现#2是完全正常的。

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

这样,您就可以专注于只测试您的单元--实现#2 --而不必担心它的所有依赖项。这些都是被嘲笑的,你知道,他们会表现得像他们应该的那样。

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

票数 6
EN

Stack Overflow用户

发布于 2017-08-26 21:04:42

让我们转向一个更面向对象的讨论。假设我们编写一个Car接口,它有一个类似putFuel的方法,

代码语言:javascript
复制
interface Car {
    void putFuel(FuelStation fs);
}

现在我想出三个版本的cars -PetrolCar实现Car -DieselCar实现Car -CNGCar实现Car

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

因此,我应该为所有的实现编写测试用例,因为每个实现都是不同的。还要考虑到,在未来,所有实现都可能具有接口可能没有的不同方法,因此为每个实现编写单独的单元测试用例是非常有意义的。

票数 2
EN

Stack Overflow用户

发布于 2017-08-25 12:46:20

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45874049

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档