Java自学者论坛

用户名  找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 364|回复: 0

Spring Boot 解决方案 - JUnit 测试

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-6-21 09:37:24 | 显示全部楼层 |阅读模式

    简单的 JUnit 项目

    回顾一下创建并运行简单的 JUnit 测试项目,先添加 JUnit 依赖然后编写类似如下模板的测试类,使用 IDE 的话直接用插件运行就行, 使用 Maven 的话运行命令 mvn test 就能看到测试结果。

    public class Tests {
        @Test
        public void test() {
            // ...
        }
    }
    

    执行顺序

    为满足一些测试对环境的要求,例如数据库连接及关闭,JUnit 提供了一系列注解来在测试前后进行操作,以下为注解运行的顺序的介绍。

    • @BeforeClass 运行测试类前执行且只执行一次
    • @Before 每个测试方法执行前执行
    • @Test 测试方法,每个测试方法的顺序也可以指定
    • @After 每个测试方法执行后执行
    • @AfterClass 运行测试类后执行且只执行一次

    上面提到测试方法也可以指定顺序,利用 @FixMethodOrder 标注测试类。

    @FixMethodOrder(MethodSorters.DEFAULT)
    public class Tests {
        // ...
    }
    

    MethodSorters 有三种取值,分别
    代表不同的执行顺序。

    • DEFAULT 由方法名的 hashcode 值大小决定执行顺序,若值一样则根据方法名的字典顺序
    • NAME_ASCENDING 由方法名的字典顺序决定执行顺序
    • JVM 由 JVM 返回的方法名的顺序决定

    断言

    JUnit 的 org.junit.Assert 类提供了一系列静态方法用来断言,当断言不成立时会调用 fail 抛出 AssertionError 的异常,也可手动调用 fail 来抛出异常,下面列表为该类提供的静态方法。

    • assertTrue
    • assertFalse
    • assertNull
    • assertNotNull
    • assertSame
    • assertNotSame
    • assertEquals
    • assertArrayEquals
    • assertThat
    • fail

    assertEquals 与 assertSame 区别

    阅读源码可以知道,assertEquals 是调用对象的 equals 方法进行比较,而 assertSame 则是直接用 == 进行比较。

    所以用 assertSame 来断言值类型或者内存地址是否相等,而用 assertEquals 来断言对象的 equals 方法是否为真。

    assertThat 与 Matcher

    assertThat 利用 matcher 匹配器来进行断言,其中一个方法签名如下所示。

    assertThat(T actual, Matcher<T> matcher)
    

    org.hamcrest.CoreMatchers 类中提供了匹配器静态的方法,可静态导入里头所有的方法,如下为用 assertThat 实现 assertTrue 的例子。

    import static org.hamcrest.CoreMatchers.*;
    
    public class Tests {
        @Test
        public void test() {
            assertThat(true, is(true)); // same as assertTure()
        }
    }
    

    另外还可以自定义匹配器,推荐继承 BaseMatcher<T> 抽象类而不是实现 Matcher<T> 接口,下面为一个简单的例子。

    public class Tests {
        private static Contains contains(String substring) {
            return new Contains(substring);
        }
        @Test
        public void test() {
            assertThat("test", contains("t"));
        }
    }
    
    class Contains extends BaseMatcher<String> {
    	private String substring;
    	
    	public Contains(String substring) {
    		this.substring = substring;
    	}
    	
    	@Override
    	public boolean matches(Object str) {
    		return ((String)str).contains(substring);
    	}
    
    	@Override
    	public void describeTo(Description description) {
    		// ...
    	}
    }
    

    Spring Boot 使用 JUnit

    Spring Boot 中无需任何配置,就能使用 JUnit 来测试,下面是 Spring Boot 项目的自带的测试模板。

    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class DemoApplicationTests {
    	@Test
    	public void contextLoads() {
    	}
    }
    

    指定运行环境及加载配置

    测试类标注了两个注解 ,JUnit 提供的 @RunWith 注解来指定运行环境,这里指定了 SpringRunner 即 Spring 的运行环境。

    @SpringBootTest 注解则用来加载所需 Spring 环境所需要的配置,这样就可以在测试环境中自动装载所需要的 Bean 。

    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class DemoApplicationTests {
        @Autowired
        Foo foo;
        
    	@Test
    	public void contextLoads() {
    	    foo.bar();
    	}
    }
    

    加速测试

    当有些测试不需要加载整个 Spring Boot 环境时,可以将 @SpringBootTest 改用 @ContextConfiguration 注解只加载所需配置,这样可以加速测试,下面例子是只需要 DemoConf 类的配置。当完全不需要 Spring 环境来测试时,还可以去掉 @RunWith 注解。

    @RunWith(SpringRunner.class)
    @ContextConfiguration(classes = DemoConf.class)
    public class DemoApplicationTests {
        // ...
    }
    
    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-3-7 03:37 , Processed in 0.107837 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表