关于JUnit中的assertThat的部分问题
写在最前面
如果大家需要使用下面几个函数之一
assertThat( mapObject, hasKey ( "key" ) );
assertThat( mapObject, hasEntry( "key", "value" ) );
assertThat( mapObject, hasValue ( "key" ) );
请去下载hamcrest-all.jar
下载链接,而且注意hamcrest-all.jar
在加入时要放在junit.jar
的前面,即可解决问题。
示例代码:
package edu.hit;
import static org.junit.Assert.*;
import static org.hamcrest.CoreMatchers.*;
import org.hamcrest.*;
import org.junit.Test;
import java.util.*;
public class TestHamcrest {
@Test
public void testHamcrest(){
Map<String, Integer> map = new HashMap<>();
List<String> list = new ArrayList<>();
assertEquals(Collections.EMPTY_MAP, map);
assertEquals(Collections.EMPTY_LIST, list);
list.add("string");
map.put("string", 1);
assertThat(list, hasItem("string"));
assertThat(map, Matchers.hasEntry("string", 1));
assertThat(map, Matchers.hasKey("string"));
assertThat(map, Matchers.hasValue(1));
}
}
以下内容包含个人吐槽,不喜勿喷。
这次通过查assertThat
的用法,发现了在某DN社区中严重的抄袭现象,几乎所有的博客的使用说明都是来自于某一个版本的博客,还都没有标明出处,对于查阅出现了极大的不便。更为严重的是,都是一些使用的罗列没有,而没有对其中一些注意事项进行标明。
这里对于我踩过的坑进行一下标明,为以后在使用的童鞋们提供些许便利。
对于assertThat
,查阅中文的博客,都会标明可以使用assertThat(mapObject, hasEntry("key", "value")
这样一种方法,用于断言是否某个map中含有key到value这样一种对应关系。但是,却没有注明需要导入什么包,如果直接使用,compiler会直接显示类似这样的一个错误如下图
这样的错误并不是由于你的使用有什么错误,而是缺乏相对应的包支持。 于是就去查Stack Overflow,然后就会发现大量的回答中出现了这样一个类:
然后出于本能反应,哦原来是我没有导入这个类啊,导入不就完啦嘛,接下来就会发现你的org.hamcrest.
里面压根都没有Matchers
这个类(黑人问号.jpg),(内心OS:我是用的JUnit官方提供的jar包啊,但是为啥他提供的类里面为啥没有我需要的类呢?)。
于是,我决定去看看我下的是不是官方jar包有问题,我又去了JUnit4的下载页面,看到了这样一个界面:
心想对啊,这跟我的本地是一样的啊。既然JUnit的包一样,那是不是官方的包提供的有问题啊?于是我好奇地度娘了一下hamcrest-core.jar
,结果发现有了相关的另一个jar包叫hamcrest-all.jar
,嗯官方把一些不常用的类没有放进hamcrest-core.jar
中,其中就包括org.hamcrest.Matchers.*
里面的类。
所以JUnit官方能不能认真一点,既然默认提供的包缺少部分类,能不能在下载页面标明一下,这样在使用的时候我们也能根据我们的使用目的来选择下载什么包啊。嗯也希望某DN社区的童鞋们多发一些有意义的东西,减少互相抄袭。
下面是hamcrest-core.jar
包含的内容:
下面是hamcrest-all.jar
内包含的内容:
可以对比一下有多少类没有出现在默认的包里。