junit 预期错误

有时,当我们收到对jOOQ或其他库的拉取请求时,人们会将单元测试中的代码更改为更“惯用的JUnit”。 特别是,这意味着他们倾向于更改此代码(公认的不是那么漂亮的代码):

@Test
public void testValueOfIntInvalid() {try {ubyte((UByte.MIN_VALUE) - 1);fail();}catch (NumberFormatException e) {}try {ubyte((UByte.MAX_VALUE) + 1);fail();}catch (NumberFormatException e) {}
}

…成为“更好”和“更清洁”的版本:

@Test(expected = NumberFormatException.class)
public void testValueOfShortInvalidCase1() {ubyte((short) ((UByte.MIN_VALUE) - 1));
}@Test(expected = NumberFormatException.class)
public void testValueOfShortInvalidCase2() {ubyte((short) ((UByte.MAX_VALUE) + 1));
}

我们获得了什么?

没有!

当然,我们已经必须使用@Test批注,因此我们不妨使用其expected的属性吧? 我声称这是完全错误的。 有两个原因。 当我说“两个”时,我的意思是“四个”:

1.在代码行数方面,我们并没有真正获得任何好处

比较语义上有趣的位:

// This:
try {ubyte((UByte.MIN_VALUE) - 1);fail("Reason for failing");
}
catch (NumberFormatException e) {}// Vs this:
@Test(expected = NumberFormatException.class)
public void reasonForFailing() {ubyte((short) ((UByte.MAX_VALUE) + 1));
}

给定或采用空格格式,基本语义信息量完全相同:

  1. 该方法正在测试中的ubyte() 。 这不会改变
  2. 我们要传递给失败报告的消息(以字符串或方法名称的形式)
  3. 异常类型和预期的事实

因此,即使从样式角度来看,这也不是真正有意义的更改。

2.无论如何我们都必须将其重构

在注释驱动的方法中,我所能做的就是测试异常类型 。 例如,在以后要添加更多测试的情况下,我无法对异常消息做出任何假设。 考虑一下:

// This:
try {ubyte((UByte.MIN_VALUE) - 1);fail("Reason for failing");
}
catch (NumberFormatException e) {assertEquals("some message", e.getMessage());assertNull(e.getCause());...
}

3.单一方法调用不是单位

单元测试称为testValueOfIntInvalid() 。 因此, 通常在输入无效的情况下,要测试的语义“单位”是UByte类型的valueOf()行为的语义“单位”。 不适用于单个值,例如UByte.MIN_VALUE - 1

不应将其拆分为更小的单元,仅仅是因为这是我们可以将@Test注释刺入其功能范围的唯一方法。

TDD伙计们,请听听。 我从不希望将我的API设计或我的逻辑塞进由“向后”测试框架(不是个人的,JUnit)强加的一些怪异的限制。 永不 ! “我的” API比“您的”测试重要100倍。 这包括我不想:

  • 公开一切
  • 使一切都没有定论
  • 使一切都可以注射
  • 使所有内容均为非静态
  • 使用注释。 我讨厌注解。

不。 你错了。 Java已经不是一种太复杂的语言,但是让我至少可以使用我想要的任何方式使用它提供的一些功能。

不要因为测试而在我的代码上强加您的设计或语义上的毁损。

好。 我React过度了。 我总是在带有批注的情况下 。 因为…

4.对于控制流结构而言,注释始终是错误的选择

一次又一次,我为Java生态系统中的注释滥用而感到惊讶。 注释对于三件事有好处:

  1. 可处理的文档(例如@Deprecated
  2. 方法,成员,类型等的自定义“修饰符”(例如@Override
  3. 面向方面的编程(例如@Transactional

并且要注意,@ @Transactional是使其成为主流的少数几个真正有用的方面之一(日志挂钩是另一个方面,或者,如果绝对必须的话,可以进行依赖注入)。 在大多数情况下,AOP是解决问题的利基技术,您通常在普通程序中不希望这样做。

用注解对控制流结构进行建模绝对不是一个好主意,更不用说测试行为了

是。 Java已经采用了很长的(缓慢的)方法来包含更复杂的编程习惯。 但是,如果您对单元测试中偶尔的try { .. } catch { .. }语句的冗长内容感到不满,那么您可以找到解决方案。 是Java 8。

如何用Java 8更好地做

JUnit lambda正在开发中: http : //junit.org/junit-lambda.html

他们将新的功能性API添加到新的Assertions类中: https : //github.com/junit-team/junit-lambda/blob/master/junit5-api/src/main/java/org/junit/gen5/api /Assertions.java

一切都基于Executable功能接口 :

@FunctionalInterface
public interface Executable {void execute() throws Exception;
}

该可执行文件现在可以用于实现断言引发(或不引发)异常的代码。 请参见Assertions的以下方法

public static void assertThrows(Class<? extends Throwable> expected, Executable executable) {expectThrows(expected, executable);
}public static <T extends Throwable> T expectThrows(Class<T> expectedType, Executable executable) {try {executable.execute();}catch (Throwable actualException) {if (expectedType.isInstance(actualException)) {return (T) actualException;}else {String message = Assertions.format(expectedType.getName(), actualException.getClass().getName(),"unexpected exception type thrown;");throw new AssertionFailedError(message, actualException);}}throw new AssertionFailedError(String.format("Expected %s to be thrown, but nothing was thrown.", expectedType.getName()));
}

而已! 现在,那些反对try { .. } catch { .. }块的冗长的人可以重写此代码:

try {ubyte((UByte.MIN_VALUE) - 1);fail("Reason for failing");
}
catch (NumberFormatException e) {}

…进入:

expectThrows(NumberFormatException.class, () -> ubyte((UByte.MIN_VALUE) - 1));

如果我想对异常进行进一步检查,可以这样做:

Exception e = expectThrows(NumberFormatException.class, () -> ubyte((UByte.MIN_VALUE) - 1));
assertEquals("abc", e.getMessage());
...

出色的工作,JUnit lambda团队!

函数式编程每次都会击败注释

注释被滥用了很多逻辑 ,主要是在JavaEE和Spring环境中,它们都非常渴望将XML配置移回Java代码。 这是错误的方法,这里提供的示例清楚地表明,与使用批注相比,几乎总是有一种更好的方法可以使用面向对象或功能编程来显式地写出控制流逻辑。

@Test(expected = ...)的情况下,我得出结论:

安息, expected

(无论如何,它不再是JUnit 5 @Test批注的一部分)

翻译自: https://www.javacodegeeks.com/2016/01/use-junits-expected-exceptions-sparingly.html

junit 预期错误

junit 预期错误_谨慎使用JUnit的预期异常相关推荐

  1. junit单元测试断言_简而言之,JUnit:单元测试断言

    junit单元测试断言 简而言之,本章涵盖了各种单元测试声明技术. 它详细说明了内置机制, Hamcrest匹配器和AssertJ断言的优缺点 . 正在进行的示例扩大了主题,并说明了如何创建和使用自定 ...

  2. mysql报196271错误_超过mysql最大连接的异常

    超过mysql最大连接的错误 出现错误: com.mysql.jdbc.CommunicationsException: The driver was unable to create a conne ...

  3. mysql外部表不是预期格式_批量Excel数据导入Oracle数据库 导入excel错误:外部表不是预期的格式 解决方案...

    在asp.net网站中导出Excel文件后,再把文件导入到数据库中. 读取Excel文件时,打开连接出错. 错误为:外部表不是预期的格式 解决:检查了一下,导出的Excel是标准文件不是html,没错 ...

  4. idea测试单元错误_不要单元测试错误

    idea测试单元错误 在进入标题主题之前,我们先来看一个简单的编程示例. 在编程任务中,我将演示一些不良的编码样式,并以此为基础,我将更容易解释为什么相同的样式在单元测试中是不良的. 好吧,既然我写了 ...

  5. 解决error C2760:语法错误: 意外的令牌“标识符”,预期的令牌为“类型说明符”

    VS2017编译会报错 error C2760:语法错误: 意外的令牌"标识符",预期的令牌为"类型说明符" 解决办法: 项目属性->C/C++ -> ...

  6. mysql 不显示消息错误_如何编写不吸的错误消息

    mysql 不显示消息错误 by Justin Fuller 贾斯汀·富勒(Justin Fuller) 如何编写不吸的错误消息 (How To Write Error Messages That D ...

  7. [Windows] 程序生成出现语法错误: 意外的令牌“标识符”,预期的令牌为“类型说明符”...

    程序生成出现语法错误: 意外的令牌"标识符",预期的令牌为"类型说明符" 将平台工具集改为VS 2015 (v140) ,重新编译即可 转载于:https:// ...

  8. excel切片器显示错误_带切片器的Excel弹出选择器工具

    excel切片器显示错误 Slicers make it easy to select from a list of items, but they take up valuable space on ...

  9. 安装TIA博途V14 SP1后,打开软件时系统提示出现一个并行的错误_解决办法

    安装TIA博途V14 SP1后,打开软件时系统提示出现一个并行的错误_解决办法 如下图所示,已经将 TIA Portal 从 V14 升级到 V14 SP1.成功完成升级而没有任何错误后,再次打开 T ...

最新文章

  1. LVS(12)——sh
  2. jenkins部署三种构建方式的详细步骤
  3. java是怎么实现文件上传的_java怎么实现大文件上传
  4. 别怀疑,孩子在家里也能学编程!
  5. 关于“稳定”的相爱相杀:负载测试和压力测试
  6. 对象流的序列化和反序列化
  7. 计算机出现假桌面怎么解决办法,Win10系统因为“AppHangXProcB1”造成桌面不停假死怎么处理...
  8. 一文理解完美二叉树, 完全二叉树和完满二叉树
  9. 基于com的delphi和matlab接口编程研究,基于COM组件的VB与MATLAB接口编程(续)
  10. Python爬虫 Selenium实现自动登录163邮箱和Locating Elements介绍
  11. 学计算机白头,为何会有人“一夜白头” 它有科学依据吗?看完终于懂了
  12. 知道两点经纬度,计算双方距离与方向的原理
  13. 两个互质整数的线性组合问题
  14. 一些个人电脑问题记录
  15. 如何打开电脑c语言窗口,C语言控制台窗口图形界面编程(五). -电脑资料
  16. win7如何远程控制linux桌面软件,Win7系统如何远程桌面登录ubuntu12.04系统
  17. 中英文免安装版IE6、IE7、IE8浏览器下载
  18. mysql配置时区 serverTimeZone
  19. Flutter 打包iOS包出现 ld: bitcode bundle could not be generated because
  20. Android 10 Firewall blacklist 设置范例

热门文章

  1. ssl2294-打包【dp练习】
  2. 【SAM】差异(P4248)
  3. 【搜索树】高级打字机(luogu 1383)
  4. 【并查集】【图论】【最小生成树】剑鱼行动(ssl 1618)
  5. 【动态规划】拔河比赛 (ssl 1638)
  6. 33、JAVA_WEB开发基础之会话机制
  7. K8S Learning(3)——资源管理
  8. Hadoop入门(四)HDFS编程
  9. 子类可以继承到父类上的注解吗
  10. Java8-本地缓存