java单元测试测试异常_Java单元测试中出现意外异常
我真的是JUnit的新手和一般的单元测试,我很难找到合适的方法。处理意外异常的更好方法是什么?为什么?
方法A:
首先捕获预期的,通过消息测试失败
在最后一个catch块中,捕获一般异常并使测试失败并显示一些"意外异常已发生"消息
方法B:
只捕获预期的,失败的消息
用throws Exception标记测试方法,让任何意外的"冒泡"完全脱离测试
并且为了增加混乱,通过说"意外异常",我指的是以下任何一种:
被测试的方法声称要抛出的异常,但在这种情况下。例如,我的方法抛出IllegalArgumentException和NullPointerException,但是在这个try块中,我希望它抛出IllegalArgument; NullPointer被认为是意外的。抓住,失败或冒泡?
一般的例外我真的无法预料
我知道这个问题有点令人困惑,我自己也迷失了,但希望有人会给我任何暗示。不会因为downvotes而责怪你,它仍然值得冒险:)
抛出@Test注释不期望的异常的测试将被标记为失败。 期望抛出多个异常的单元测试不再是单元测试。
使用JUnit的测试方法,基本上,如果方法设法无错误地结束,JUnit会认为测试已通过。所以你应该做的是捕获应该到达的所有异常。在这种情况下,这是你可以做的:
@Test
public myMethodToTest()
{
try {
/* ... */
/* error should trigger before the following statement : */
fail("Reason");
} catch(GoodException e) { }
// no need to do anything since you expected that error
// You can let the test ends without further statement
}
还有另一种写作方式:
@Test (expected=IndexOutOfBoundsException.class)
public void elementAt()
{
int[] intArray = new int[10];
int i = intArray[20]; // Should throw IndexOutOfBoundsException
}
如果你仍然想要,你仍然可以捕获不应该触发的异常,并执行类似的操作:
@Test
public myMethodToTest()
{
try {
/* ... */
} catch(BadException e) {
fail("Reason");
}
}
即使没有抛出GoodException,第一个测试也会通过。 它在try块的末尾没有fail()调用。 第二个测试可以简单地让异常传播,JUnit会标记它失败(出错)是抛出异常。
对啊,对不起,让我纠正第一次测试。
我非常喜欢以前的样式,在那里你可以准确地捕获预期的异常。 使用@Test注释的expected属性的问题是,如果从代码中的错误位置(例如某些设置代码中)抛出了正确的异常,那么测试将通过,即使代码是 做错了。 我已经在实际的代码库中看到过这种情况。
您可以使用此语法查看SO问题(在Java中断言异常,如何?)
@Test(expected=NumberFormatException.class);
确保可能抛出预期的异常。
某些方法可能合法地抛出多个异常。例如,如果您正在求解二次方程,则可以预期除以零和负平方根。您应该通过编写两个单独的单元测试来测试每个单元测试,每个单元测试都设计为失败,因此测试抛出异常。
例:
Pair roots = solveQuadratic(double a, double b, double c) {
//...
}
其中Pair是预期的一对解决方案。
这是我们期望通过的测试。
@Test
public void testQuadratic() {
Pair roots = solveQuadratic(1.0, -5.0, 6.0);
Assert.assertEqual(3.0, roots.largest, 0.000001);
Assert.assertEqual(2.0, roots.smallest, 0.000001);
}
这是我们期望失败的一个:
@Test
public void testQuadraticDivideByZero() {
try {
Pair roots = solveQuadratic(0.0, -5.0, 6.0);
Assert.fail("should have failed with ArithmeticException");
} catch (ArithmeticException e) {
}
}
在这种情况下,您可能希望编写代码以便捕获a=0.0并使用消息抛出IllegalArgumentException。
一般来说,你应该想到所有可能出错的东西并捕获它们并测试陷阱。因为某天有人会将a=0.0传递给此方法并需要明确的错误消息。
我感觉到,到目前为止,没有一个答案真正达到了问题的目的。 OP明确要求处理意外的异常。我在这个主题上的两分钱是:
这取决于您想要达到的详细程度:
通常,您应该努力进行简短的测试,以确定代码的一个方面。理想情况下,只需调用少数方法,其中只有一个或两个可能引发意外异常。在这种情况下,为所有已检查的异常添加throws子句应足以在测试失败时分析问题。我更喜欢这种解决方案,因为它更容易编写,更短,更全面。
例:
@Test
public void testPrivateMethod() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
//...
Method method = MyClass.class.getMethod("privateMethod");
method.setAccessible(true);
boolean result = method.invoke(myInstance);
assertTrue(result);
}
如果测试代码需要更复杂,则多个方法可能会引发异常。可能有些人甚至会抛出同类异常。在这种情况下,try-catch块可能有助于在测试用例失败时定位问题。但是,这会产生更多代码,并可能使测试的可读性降低。
例:
@Test
public void testPrivateMethod() {
//...
Method method;
try {
Method method = MyClass.class.getMethod("privateMethod");
method.setAccessible(true);
boolean result = method.invoke(myInstance);
assertTrue(result);
} catch (NoSuchMethodException | SecurityException e) {
fail("Could not access method 'privateMethod'.");
} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
fail("Call to 'privateMethod' raised an exception.")
}
}
我希望我的意图是正确的。
拥有测试用例的想法是通过为所有边界条件提供输入来避免所有意外的异常。
如果该方法抛出一些Exceptions(该方法具有throws子句并且它尝试通过一些已检查的异常通知调用者),则传递使您的测试用例抛出该异常的输入,并在您的测试用例中输入catch。这使得其中一个测试用例PASS。
如果该方法抛出了意外的异常,请修复该方法。一个方法应该足够稳定,不要抛出意外的异常,比如NullPointerException,应该修复。
因此,要回答您的问题,处理意外异常的更好方法是通过增强您修复它的测试用例来找到它们。
UNIT测试方法的想法是确保它是一种可靠的方法。可靠性意味着对于给定的输入,输出始终是预期的输出。因此,它取决于方法的预期是否存在异常。如果我们认为发生了意外的异常并且预计方法无法对其进行任何操作,那么您可以将测试用例标记为PASSED。但是,如果期望该方法处理任何异常情况并且如果不能,则将测试用例标记为FAILED。
java单元测试测试异常_Java单元测试中出现意外异常相关推荐
- java 到异常_java编程中遇到的异常以及异常的一些处理
n 异常的概念 程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常.异常发生时,是任程序自生自灭,立刻退出终止,还是输出错误给用户? 比如除法运算.读写文件操作,都可能 ...
- java runnable 异常_JAVA 线程中的异常捕获
在java多线程程序中,所有线程都不允许抛出未捕获的checked exception(比如sleep时的InterruptedException),也就是说各个线程需要自己把自己的checked e ...
- JAVA语言异常_Java语言中常用异常类EoFException是用来处理( )异常的类_学小易找答案...
[填空题]Java语言中常用异常类ClassNotFoundException是用来处理 ( )的异常的类 [填空题]Java语言声明 ( ) 类为会产生"严重错误"的类 [简答题 ...
- java简单的异常_Java的简单理解(8)-异常(Exception)
Java 异常处理 异常处理机制是Java语言中一个独特之处,它为开发稳定的软件系统提供了有力的支持.它主要使用捕获异常和声明抛弃异常两种方法来处理程序中可能出现异常的语句块,其中捕获异常的方法是一种 ...
- java 二维数组_Java中二维数组和异常的内容及应用
一.二维数组 数组中嵌套数组就是二维数组 二维数组的声明 数据类型[][] 数组名; --推荐 数据类型 数组名[][]; 初始化: 动态: 数据类型[][] 数组名 = new 数据类型[一维的长度 ...
- java文件运行错误_java项目中运行错误
展开全部 Java异常概念 1)Java异常是32313133353236313431303231363533e59b9ee7ad9431333363373666Java提供的用于处理程序错误的一种机 ...
- java常见的5个异常_java常见的5种异常举例
在Java学习过程中,我们会碰到各种各样的异常,现将面试过程中遇到的常见异常做一罗列并举例: 1.NullPointerException: 空指针异常.菜鸟编程经验发现这个异常是经常会发生的,属于运 ...
- java if return 语句_Java 语言中的 return 语句
众所周知,return 只能用在有返回类型的函数中,但是有返回值的函数一定要有return吗?return都可以用在函数的哪些地方呢?这是本文需要讨论的问题. -------------------- ...
- Java私有方法解释_java接口中 定义 private 私有方法
在传统的Java编程中,被广为人知的一个知识点是:java Interface接口中不能定义private私有方法.只允许我们定义public访问权限的方法.抽象方法或静态方法.但是从Java 9 开 ...
最新文章
- GC悲观策略之Parallel GC篇
- 怎么安装python3.6.2_centos7.2下安装python3.6.2
- 【Leetcode | 03】String
- Linux C 数据结构——二叉树
- IDEA启动Tomcat AJP连接器配置secretRequired=“true“,但是属性secret确实空或者空字符串,这样的组合是无效的解决办法
- html 图片自由缩放_PS中的“缩放”
- 燃气灶电气线路图及原理_电气安装造价如何入门,核心知识已为你打包
- WordPress网站访问慢解决方案(超详细图文教程)
- Keil 5安装教程,搭建单片机环境
- [渝粤教育] 晋中学院 晋商大院三雕艺术 参考 资料
- 苹果CMS采集参数全自动采集教程
- 手把手教你用GAN实现半监督学习
- ui设计现状与意义_对于ui设计行业来说,用户界面设计的发展现状是什么?
- android图标生成网址
- 白杨SEO:中小企业发广告去哪个平台?一般选择哪种推广方式方法比较好?
- 完美安装BatteryHistorian-Note: Could not parse aggregated battery stats.
- “做好DevOps即是用好一种工具”的认知误区
- 什么是快速恢复计算机网络,电脑网络出现问题,如何快速复原修复?数码君帮你解决...
- 皇城PK--循环的简单运用
- 高中要学的计算机教材,中小学计算机校本课程教材.docx
热门文章
- 产品经理应该具备的技能
- 阿里巴巴的店铺引流技巧
- 太极阴怎么使用模块_面具Magisk刷入模块重启不生效怎么解决?ROOT权限可使用+面具Magisk里下载功能显示“未找到模块”怎么办?...
- 什么是 web 框架?
- C语言 定义变量详解
- 江苏省事业单位考试计算机类真题及答案,2012年江苏事业单位考试综合计算机类真题及解析(5)...
- Java 打印六角星
- 1.1.2半导体二极管的结构、工作原理、参数、伏安特性;
- “工业制品化”的格力,能否战胜“空调”格力?
- 小程序 网易云课堂云开发初体验