项目概况

JUnit API

2026-01-292 min read未分类
技术框架

!!!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} 33

1.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 自动创建, 不要手动创建。