提示

只打印的单测是没有意义的,正确使用单测工具, 提高单测质量。



​#​​ 一、常用注解

​#​​ 1.1 @Before & @After

单测类中每个单测方法执行都会触发这两个方法



@Before
public void before() {
System.out.println("before");
}

@After
public void after() {
System.out.println("after");
}



1 2 3 4 5 6 7 8 9


​#​​ 1.2 @BeforeClass & @AfterClass

区别与上一个,不管单测类中有几个单测方法,都只会执行一次

要用静态修饰



@BeforeClass
public static void beforeClass() {
System.out.println("beforeClass");
}

@AfterClass
public static void afterClass() {
System.out.println("afterClass");
}



1 2 3 4 5 6 7 8 9


代码实例

针对上面说的两个注解演示一下

  • beforeClass
  • before
  • testOne
  • after
  • before
  • testTwo
  • after
  • afterClass




public class JUnitTest {

@BeforeClass
public static void beforeClass() {
System.out.println("beforeClass");
}

@Before
public void before() {
System.out.println("before");
}

@Test
public void testOne() {
System.out.println("testOne");
}

@Test
public void testTwo() {
System.out.println("testTwo");
}

@AfterClass
public static void afterClass() {
System.out.println("afterClass");
}

@After
public void after() {
System.out.println("after");
}
}



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33


​#​​ 1.3 @Timed

被修饰的方法会加上一个时间限制,如果超过了指定的时间范围,就算单侧代码执行成功 了也被认为是失败。(注意该方法依赖于SpringBoot容器)

@Timed



@Test
@Timed(millis = 2000)
public void testTimeout() {
System.out.println("testOne");
}



1 2 3 4 5


​#​​ 1.4 @Repeat

指定当前单测方法被执行的次数,如果被该注解修饰 将会被重复执行。(注意该方法依赖于SpringBoot容器)

@Repeat



@Test
@Repeat(3)
public void testOne() {
System.out.println("testOne");
}



1 2 3 4 5


​#​​ 二、断言API

断言的好处在于程序帮忙判断单测结果。不需要人工在接入验证数据。JUnit的口号就是

​keep the bar green to keep the code clean。​

一个不用观察输出就知道代码有没有问题的高效单元测试工具。



import org.hamcrest.Matchers;
import org.hamcrest.core.AllOf;
import org.hamcrest.core.AnyOf;



1 2 3


​#​​ 2.1 Matchers

Matchers



// 是否相等
Assert.assertThat(2, (2));
// 2 小于等于2
Assert.assertThat(2,Matchers.lessThanOrEqualTo(2));
Map<String,String> map = new HashMap<>();
map.put("name","jay");
// map 中是否包含key为name的元素
Assert.assertThat(map,Matchers.hasKey("name"));
// map 中是否包含value为jay的元素
Assert.assertThat(map,Matchers.hasValue("jay"));
// map 中是否包含name等于jay的元素
Assert.assertThat(map,Matchers.hasEntry("name","jay"));



1 2 3 4 5 6 7 8 9 10 11 12


​#​​ 2.2 AllOf

全部满足



// 2 小于4同时也小于3
Assert.assertThat(2, AllOf.allOf(Matchers.lessThan(4), Matchers.lessThan(3)));



1 2


​#​​ 2.3 AnyOf

任意满足



// 2 大于1小于3
Assert.assertThat(2, AnyOf.anyOf(Matchers.greaterThan(1), Matchers.lessThan(3)));



1 2


​#​​ 三、结果验证

​#​​ 3.1 空值验证



@Test
public void test() {
Object o = new Object();
// 非空验证
Assert.assertNotNull(o);
// 空值验证
Assert.assertNull(null);
}



1 2 3 4 5 6 7 8


​#​​ 3.2 逻辑验证



import static org.hamcrest.MatcherAssert.*;
import static org.hamcrest.CoreMatchers.*;
public calss Test{
@Test
public void test() {
//测试变量是否大于指定值
ArrivalNoticeOrderDO ao = new ArrivalNoticeOrderDO();
ao.setId(12L);
//测试所有条件必须成立
assertThat(ao.getId(), allOf(is(12L)));
//测试只要有一个条件成立
assertThat(ao.getId(), anyOf(is(50), is(12L)));
//测试变量值等于指定值
assertThat(ao.getId(), is(12L));
}
}



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16


​#​​ 3.3 异常验证



/**
* 预期异常
*/
@Test(expected = NullPointerException.class)
public void testError(){
Object o = null;
System.out.println(o.toString());
}



1 2 3 4 5 6 7 8


​#​​ 四、快速创建

建议使用 ​​Idea​​ 自动创建, 不要手动创建。