JUnit API
技术框架
!!!tip 只打印的单测是没有意义的,正确使用单测工具, 提高单测质量。 !!!
一、常用注解
1.1 @Before & @After
单测类中每个单测方法执行都会触发这两个方法
java
1 @Before
2 public void before() {
3 System.out.println("before");
4 }
5
6 @After
7 public void after() {
8 System.out.println("after");
9 }1.2 @BeforeClass & @AfterClass
区别与上一个,不管单测类中有几个单测方法,都只会执行一次
要用静态修饰
java
1 @BeforeClass
2 public static void beforeClass() {
3 System.out.println("beforeClass");
4 }
5
6 @AfterClass
7 public static void afterClass() {
8 System.out.println("afterClass");
9 }!!!info 代码实例
针对上面说的两个注解演示一下
- beforeClass
- before
- testOne
- after
- before
- testTwo
- after
- afterClass !!!
java
1public class JUnitTest {
2
3 @BeforeClass
4 public static void beforeClass() {
5 System.out.println("beforeClass");
6 }
7
8 @Before
9 public void before() {
10 System.out.println("before");
11 }
12
13 @Test
14 public void testOne() {
15 System.out.println("testOne");
16 }
17
18 @Test
19 public void testTwo() {
20 System.out.println("testTwo");
21 }
22
23 @AfterClass
24 public static void afterClass() {
25 System.out.println("afterClass");
26 }
27
28 @After
29 public void after() {
30 System.out.println("after");
31 }
32}
331.3 @Timed
被修饰的方法会加上一个时间限制,如果超过了指定的时间范围,就算单侧代码执行成功 了也被认为是失败。(注意该方法依赖于SpringBoot容器)
@Timed
java
1 @Test
2 @Timed(millis = 2000)
3 public void testTimeout() {
4 System.out.println("testOne");
5 }1.4 @Repeat
指定当前单测方法被执行的次数,如果被该注解修饰 将会被重复执行。(注意该方法依赖于SpringBoot容器)
@Repeat
java
1 @Test
2 @Repeat(3)
3 public void testOne() {
4 System.out.println("testOne");
5 }二、断言API
断言的好处在于程序帮忙判断单测结果。不需要人工在接入验证数据。JUnit的口号就是
keep the bar green to keep the code clean。
一个不用观察输出就知道代码有没有问题的高效单元测试工具。
text
1import org.hamcrest.Matchers;
2import org.hamcrest.core.AllOf;
3import org.hamcrest.core.AnyOf;2.1 Matchers
Matchers
java
1 // 是否相等
2 Assert.assertThat(2, Matchers.is(2));
3 // 2 小于等于2
4 Assert.assertThat(2,Matchers.lessThanOrEqualTo(2));
5 Map<String,String> map = new HashMap<>();
6 map.put("name","jay");
7 // map 中是否包含key为name的元素
8 Assert.assertThat(map,Matchers.hasKey("name"));
9 // map 中是否包含value为jay的元素
10 Assert.assertThat(map,Matchers.hasValue("jay"));
11 // map 中是否包含name等于jay的元素
12 Assert.assertThat(map,Matchers.hasEntry("name","jay"));2.2 AllOf
全部满足
java
1 // 2 小于4同时也小于3
2 Assert.assertThat(2, AllOf.allOf(Matchers.lessThan(4), Matchers.lessThan(3)));2.3 AnyOf
任意满足
java
1 // 2 大于1小于3
2 Assert.assertThat(2, AnyOf.anyOf(Matchers.greaterThan(1), Matchers.lessThan(3)));三、结果验证
3.1 空值验证
java
1 @Test
2 public void test() {
3 Object o = new Object();
4 // 非空验证
5 Assert.assertNotNull(o);
6 // 空值验证
7 Assert.assertNull(null);
8 }3.2 逻辑验证
java
1 import static org.hamcrest.MatcherAssert.*;
2 import static org.hamcrest.CoreMatchers.*;
3 public calss Test{
4 @Test
5 public void test() {
6 //测试变量是否大于指定值
7 ArrivalNoticeOrderDO ao = new ArrivalNoticeOrderDO();
8 ao.setId(12L);
9 //测试所有条件必须成立
10 assertThat(ao.getId(), allOf(is(12L)));
11 //测试只要有一个条件成立
12 assertThat(ao.getId(), anyOf(is(50), is(12L)));
13 //测试变量值等于指定值
14 assertThat(ao.getId(), is(12L));
15 }
16 }3.3 异常验证
java
1 /**
2 * 预期异常
3 */
4 @Test(expected = NullPointerException.class)
5 public void testError(){
6 Object o = null;
7 System.out.println(o.toString());
8 }四、快速创建
建议使用 Idea 自动创建, 不要手动创建。