JUnit API

举报
西魏陶渊明 发表于 2022/09/25 02:56:11 2022/09/25
【摘要】 提示 只打印的单测是没有意义的,正确使用单测工具, 提高单测质量。 # 一、常用注解 # 1.1 @Before & @After 单测类中每个单测方法执行都会触发这两个方法 @Before public void before() { System.out.prin...

提示

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

# 一、常用注解

# 1.1 @Before & @After

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


    
  1. @Before
  2. public void before() {
  3. System.out.println("before");
  4. }
  5. @After
  6. public void after() {
  7. System.out.println("after");
  8. }
1 2 3 4 5 6 7 8 9

# 1.2 @BeforeClass & @AfterClass

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

要用静态修饰


    
  1. @BeforeClass
  2. public static void beforeClass() {
  3. System.out.println("beforeClass");
  4. }
  5. @AfterClass
  6. public static void afterClass() {
  7. System.out.println("afterClass");
  8. }
1 2 3 4 5 6 7 8 9

代码实例

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

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


    
  1. public class JUnitTest {
  2. @BeforeClass
  3. public static void beforeClass() {
  4. System.out.println("beforeClass");
  5. }
  6. @Before
  7. public void before() {
  8. System.out.println("before");
  9. }
  10. @Test
  11. public void testOne() {
  12. System.out.println("testOne");
  13. }
  14. @Test
  15. public void testTwo() {
  16. System.out.println("testTwo");
  17. }
  18. @AfterClass
  19. public static void afterClass() {
  20. System.out.println("afterClass");
  21. }
  22. @After
  23. public void after() {
  24. System.out.println("after");
  25. }
  26. }
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


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

# 1.4 @Repeat

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

@Repeat


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

# 二、断言API

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

keep the bar green to keep the code clean。

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


    
  1. import org.hamcrest.Matchers;
  2. import org.hamcrest.core.AllOf;
  3. import org.hamcrest.core.AnyOf;
1 2 3

# 2.1 Matchers

Matchers


    
  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"));
1 2 3 4 5 6 7 8 9 10 11 12

# 2.2 AllOf

全部满足


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

# 2.3 AnyOf

任意满足


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

# 三、结果验证

# 3.1 空值验证


    
  1. @Test
  2. public void test() {
  3. Object o = new Object();
  4. // 非空验证
  5. Assert.assertNotNull(o);
  6. // 空值验证
  7. Assert.assertNull(null);
  8. }
1 2 3 4 5 6 7 8

# 3.2 逻辑验证


    
  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. }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

# 3.3 异常验证


    
  1. /**
  2. * 预期异常
  3. */
  4. @Test(expected = NullPointerException.class)
  5. public void testError(){
  6. Object o = null;
  7. System.out.println(o.toString());
  8. }
1 2 3 4 5 6 7 8

# 四、快速创建

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

文章来源: springlearn.blog.csdn.net,作者:西魏陶渊明,版权归原作者所有,如需转载,请联系作者。

原文链接:springlearn.blog.csdn.net/article/details/125858092

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。