使用JUnit来测试Java代码中的异常

使用JUnit来测试Java代码中的异常有很多种方式,你知道几种?

  给定这样一个class。


Person.java

public class Person {

private String name;

private int age;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

if (age < 0 ) {

throw new IllegalArgumentException("age is invalid");

}

this.age = age;

}

}

  我们来测试setAge方法。


Try-catch 方式

@Test

public void shouldGetExceptionWhenAgeLessThan0() {

Person person = new Person();

try {

person.setAge(-1);

fail("should get IllegalArgumentException");

} catch (IllegalArgumentException ex) {

assertThat(ex.getMessage(),containsString("age is invalid"));

}

}

  这是最容易想到的一种方式,但是太啰嗦。

JUnit annotation方式

  JUnit中提供了一个expected的annotation来检查异常。


@Test(expected = IllegalArgumentException.class)

public void shouldGetExceptionWhenAgeLessThan0() {

Person person = new Person();

person.setAge(-1);

}

  这种方式看起来要简洁多了,但是无法检查异常中的消息。

  ExpectedException rule

  JUnit7以后提供了一个叫做ExpectedException的Rule来实现对异常的测试。


@Rule

public ExpectedException exception = ExpectedException.none();

@Test

public void shouldGetExceptionWhenAgeLessThan0() {

Person person = new Person();

exception.expect(IllegalArgumentException.class);

exception.expectMessage(containsString("age is invalid"));

person.setAge(-1);

}

  这种方式既可以检查异常类型,也可以验证异常中的消息。

  使用catch-exception库

  有个catch-exception库也可以实现对异常的测试。

  首先引用该库。

  pom.xml

  <dependency>

  <groupId>com.googlecode.catch-exception</groupId>

  <artifactId>catch-exception</artifactId>

  <version>1.2.0</version>

  <scope>test</scope> <!-- test scope to use it only in tests -->

  </dependency>

  然后这样书写测试。

  @Test

  public void shouldGetExceptionWhenAgeLessThan0() {

  Person person = new Person();

  catchException(person).setAge(-1);

  assertThat(caughtException(),instanceOf(IllegalArgumentException.class));

  assertThat(caughtException().getMessage(), containsString("age is invalid"));

  }

  这样的好处是可以精准的验证异常是被测方法抛出来的,而不是其它方法抛出来的。

  catch-exception库还提供了多种API来进行测试。

  先加载fest-assertion库。

  <dependency>

  <groupId>org.easytesting</groupId>

  <artifactId>fest-assert-core</artifactId>

  <version>2.0M10</version>

  </dependency>

然后可以书写BDD风格的测试。


@Test

public void shouldGetExceptionWhenAgeLessThan0() {

// given

Person person = new Person();

// when

when(person).setAge(-1);

// then

then(caughtException())

.isInstanceOf(IllegalArgumentException.class)

.hasMessage("age is invalid")

.hasNoCause();

}

  如果喜欢Hamcrest风格的验证风格的话,catch-exception也提供了相应的Matcher API。


@Test

public void shouldGetExceptionWhenAgeLessThan0() {

// given

Person person = new Person();

// when

when(person).setAge(-1);

// then

assertThat(caughtException(), allOf(

instanceOf(IllegalArgumentException.class)

, hasMessage("age is invalid")

,hasNoCause()));

}

  第一种最土鳖,第二种最简洁,第四种最靠谱。

最新内容请见作者的GitHub页:http://qaseven.github.io/

时间: 2024-10-24 00:03:36

使用JUnit来测试Java代码中的异常的相关文章

junit 如何测试一个方法中的每行代码是否都被执行过?

问题描述 junit 如何测试一个方法中的每行代码是否都被执行过? 如题 测试一个方法中的每行代码是否都被执行过?是否有多余的代码? 解决方案 要知道一个代码块里面的代码是否被执行过,其实可以在该代码块最后加个输出语句即可,如果输出语句有执行,那么 前面的代码必然有执行. 但执行效果不一定是你的预期效果罢了(因为代码不一定是符合你的设计需求的) 解决方案二: 是否有多余的代码? 这个应该有代码校验工具. 解决方案三: 你这说的是白盒测试中的覆盖率测试,如果代码中有分支语句,需要编写多个测试用例才

使用mongo-java-driver3.0.2.jar和mongodb3.0在java代码中的用户验证4

以下是使用mongo-java-driver3.0.2.jar和mongodb3.0.4在java代码中的用户验证: ServerAddress sa = new ServerAddress(host, port); List<MongoCredential> mongoCredentialList = new ArrayList<MongoCredential>(); mongoCredentialList.add(MongoCredential.createMongoCRCre

关于在Java代码中写Sql语句需要注意的问题

最近做程序,时不时需要自己去手动将sql语句直接写入到Java代码中,写入sql语句时,需要注意几个小问题. 先看我之前写的几句简单的sql语句,自以为没有问题,但是编译直接报错. String str = "insert into XXX(a,b,c) values ('"a.getA()"','"a.getB()"','"a.getC()"');"; 研究了半天发现应该是连接字符串问题,第一次修改过后将赋值字段前后加&qu

字体颜色-android java代码中设置radiobutton选中与为选中颜色

问题描述 android java代码中设置radiobutton选中与为选中颜色 tab_rb_b.setTextColor(MainActivity.this.getResources().getColor(R.drawable.main_text_color)); 其中R.drawable.main_text_color是自己写好的 颜色改变的xml <!-- not selected --> 但是设好之后 颜色并没有随选中而改变,只是一直都是为选中状态的颜色. 哪位大神知道是怎么回事吗

colors-无法实现在java代码中设置radiobutton颜色变换

问题描述 无法实现在java代码中设置radiobutton颜色变换 我在res/color文件夹下写了一个selector,在java中setTextColor引用时无效果. 本人新手,还请各位大大指教~ 以下是关键代码 res/color/textcolor.xml <?xml version="1.0" encoding="utf-8"?> <item android:state_checked="true" androi

android 如何在java代码中方便的调用xml写的布局??

问题描述 android 如何在java代码中方便的调用xml写的布局?? 我想在activity刷新的时候重新生成一些xml写的布局,并放在 "求学"那一栏下: 想问一下有没有什么方便的方法??? 解决方案 可控的话 先加载求学哪里 先设visible为gone. 需要的时候设置为visible 解决方案二: 楼上说得对,先把控件实例化然后把visiblity设为gone 然后调用刷新按钮的时候吧实例传过去,再重新设置visiblity 解决方案三: 一种是隐藏然后显示,最好是用动态

java代码中运行doc命令

问题描述 java代码中运行doc命令 我想要在我的Java代码中运行一段doc命令,然后将正常在doc窗口输出的信息取出来,这个信息应该怎么获取,求助各位大神 解决方案 java doc运行命令 解决方案二: http://developer.51cto.com/art/201107/273282.htm

怎样在java 代码中通过ftp协议实现远程压缩文件 哪位指点一二,小弟不胜感激呀

问题描述 具体情况是这样的: 服务器端有好多xml文件有几个G,在客户端要下载下来,由于文件太大,若加上网络不好,就会下载失败. 考虑到xml文件压缩后会少的很多,就想在下载前将其压缩, 问题就在 怎样在客户端通过ftp协议将服务器端的xml文件压缩呢? 现在用的是commons-net 链接的 各位朋友都说说有啥好的解决方案莫 问题补充:能否通过写sheel脚本来执行服务器上的xml文件压缩呢? 若能实现,怎样在java代码中 执行sheel脚本 让其压缩服务器上的文件呢 解决方案 这个从理论

在下面这段java代码中,怎么获取文件大小 ,如果再加上图片尺寸更好。

问题描述 在下面这段java代码中,怎么获取文件大小 ,如果再加上图片尺寸更好. public static List> uploadFile(HttpServletRequest request, String[] params, Map values) throws Exception { List<Map<String, Object>> result = new ArrayList<Map<String, Object>>(); Multipa