java interface和impl,被测单元:Impl还是接口?
假设我有实现它的接口和实现类,并且我想为此编写单元测试。我应该测试什么接口或Impl?
这是一个例子:
public interface HelloInterface {
public void sayHello();
}
public class HelloInterfaceImpl implements HelloInterface {
private PrintStream target = System.out;
@Override
public void sayHello() {
target.print("Hello World");
}
public void setTarget(PrintStream target){
this.target = target;
}
}
因此,我有实现它的HelloInterface和HelloInterfaceImpl。什么是被测单元接口或Impl?
我认为应该是HelloInterface。请考虑以下JUnit测试草图:
public class HelloInterfaceTest {
private HelloInterface hi;
@Before
public void setUp() {
hi = new HelloInterfaceImpl();
}
@Test
public void testDefaultBehaviourEndsNormally() {
hi.sayHello();
// no NullPointerException here
}
@Test
public void testCheckHelloWorld() throws Exception {
ByteArrayOutputStream out = new ByteArrayOutputStream();
PrintStream target = new PrintStream(out);
PrivilegedAccessor.setValue(hi, "target", target);
//You can use ReflectionTestUtils in place of PrivilegedAccessor
//really it is DI
//((HelloInterfaceImpl)hi).setTarget(target);
hi.sayHello();
String result = out.toString();
assertEquals("Hello World", result);
}
}
主线实际上是我注释掉的那条线。
((HelloInterfaceImpl)hi).setTarget(target);
方法setTarget()不是我的公共接口的一部分,所以我不想 意外地
调用它。如果我真的想打电话给我,我应该花点时间考虑一下。例如,它可以帮助我发现我真正想做的是依赖注入。它为我打开了整个新机遇的世界。我可以使用一些现有的依赖注入机制(例如Spring的依赖注入机制),我可以像在代码中实际进行的那样自己模拟它,或者采用完全不同的方法。仔细看看,准备PrintSream并不是那么容易,也许我应该改用模拟对象?
编辑 :我想我应该 始终
专注于界面。从我的角度来看setTarget(),它也不是impl类的“合同”的一部分,它对依赖注入很有帮助。我认为从测试的角度来看,任何Impl类的公共方法都应视为私有方法。但是,这并不意味着我忽略了实现细节。
EDIT-2 在有多个实现\多个接口的情况下,我将测试所有实现,但是当我在setUp()方法中声明变量时,肯定会使用接口。
java interface和impl,被测单元:Impl还是接口?相关推荐
- java.lang.ClassNotFoundException: org.apache.axiom.om.impl.llom.factory.OMLinkedListMetaFactory
如果导入之后还出现java.lang.ClassNotFoundException: org.apache.axiom.om.impl.llom.factory.OMLinkedListMetaFac ...
- java.lang.ClassCastException: org.apache.axiom.om.impl.llom.factory.OMLinkedListImplFactory cannot b
项目中axiom-api-1.2.14.jar和axiom-impl-1.2.13.jar这俩个jar发生如错误 java.lang.ClassCastException: org.apache.ax ...
- java interfaceof,java interface教程
发表于 2012-10-10 09:54:47 by 月小升 java interface就是表示一个接口,接口只有方法,但是没有实际的实现.实现他的接口可以采用不同的程序. Java the int ...
- Java POI:如何读取Excel单元格值而不是计算公式
我正在使用Apache POI API从Excel文件中获取值. 除了含有公式的单元格外,一切都很好.实际上,cell.getStringCellValue()返回单元格中使用的公式而不是单元格的值. ...
- java excel单元格背景色,『excel表格尺寸设置』Java如何设置被导出excel单元格的样式?比如背景色,大小什么的?...
Java如何设置被导出excel单元格的样式?比如背景色,大小什么的? 使 poi ,具体实现 HSSFCellStyle style = null; // 创建表头style HSSFCellSty ...
- java interface和类的 extends与implement 的简单总结
interface和类.extends与implement 接口 一个接口则可以同时extends多个接口,却不能implements任何接口 类 一个类只能extends一个父类,但可以implem ...
- Java中码点和代码单元
Java中码点和代码单元 前言 码点和代码单元这两个概念还是在<Java核心技术 卷一>发现的,这也是我看过这本书里面前五章中比较有用的一个知识点(PS:毕竟Java开发都一年了,基础应用 ...
- RSU路测单元,你知道多少?
一.什么是RSU路测单元? RSU路测单元是实现智慧的路.车路协同的关键设备,设置在路侧,与附近过往车辆进行双向通信.交互数据,是智能交通系统中的一种重要设备.RSU可以连接路面原有电子设备,比如信号 ...
- java poi对Excel表格进行单元行删除
java poi对Excel表格进行单元行删除 前几天工作时,突然需要去使用POI 来对Excel 表格进行操作,其他的操作都都没什么问题,但是在需要删除某些单元行的时候碰到了一下小坑,记录下来,防止 ...
最新文章
- scipy.linalg.norm 线性代数运算 API
- CSS教程:div垂直居中的N种方法以及多行文本垂直居中的方法
- 不用oracle改用mysql_数据库从oracle移植到mysql时需要进行的修改
- 论如何优雅的处理回文串 - 回文自动机详解
- linux mysql 5.6.23_MySQL 5.6.23升级到MySQL 5.7.9
- Codeforces - 814B - An express train to reveries - 构造
- Mac上以太坊Geth环境安装
- ASIHttpRequest封装
- JUC与JVM并发编程学习笔记03
- vue使用echarts错误Failed to mount component: template or render function not defined.
- mysql 线程内存 回收_【MySQL】InnoDB后台线程与内存缓存池
- MyBatis(六)------MyBatis映射器(select元素、insert元素、update元素、select元素、sql元素)
- 计算机图形学实用教程苏小红,计算机图形学实用教程(第4版)
- 618|Python购书攻略
- 兼容android模拟器的微信apk,Android模拟器中安装apk的方法
- 移动硬盘 提示“介质受写保护“ 无法格式化等 解决方案
- STM32 hal库串口空闲中断最新用法
- 也谈Eclipse未自动在gen目录下生成R.java
- Java实现生成可跳转指定页面的二维码
- 工商管理管理学知识归纳