转自:juejin.im/post/5e709f25f265da570c754d8d
单元测试是项目开发中必不可少的一环,在 SpringBoot 的项目中,我们用 @SpringBootTest 注解来标注一个测试类,在测试类中注入这个接口的实现类之后对每个方法进行单独测试。
比如下面这个示例测试类:
@SpringBootTest
public class HelloServiceTests {
@Autowired
private IHelloSerive helloService;
@Test
public void testHello() {
// ...
但是随着项目的代码量越来越大,你会发现测试类的启动速度变得越来越慢,而大多数情况下只是为了测试一下某个实现类的某个方法而已,比如测试一个DAO类的persist方法。
实际上, @SpringBootTest 注解还提供了两个参数,好好利用这两个参数就可以让测试类的启动速度变得更快。
1.webEnvironment
这个属性决定了测试类要不要启动一个 web 环境,说白了就是要不要启动一个 Tomcat 容器,可选的值为:
MOCK, 启动一个模拟的 Servlet 环境,这是默认值
RANDOM_PORT,启动一个 Tomcat 容器,并监听一个随机的端口号
DEFINED_PORT,启动一个 Tomcat 容器,并监听配置文件中定义的端口(未定义则默认监听8080)
NONE,不启动 Tomcat 容器
如果你要测试的方法不需要用到 Tomcat 容器,比如:
测试一个 DAO 类的增删改查
测试一个 Service 类的业务方法
测试一个 Util 类的公用方法
测试一个配置文件类是否读取到了正确的值
... ...
只需要通过指定 @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE) 即可达到加速的效果。这时测试类启动时就只会初始化 Spring 上下文,不再启动 Tomcat 容器了:
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE)
public class HelloServiceTests {
@Autowired
private IHelloSerive helloService;
@Test
public void testHello() {
// ...
2. classes
classes 属性用来指定运行测试类需要装载的 class 集合,如果不指定,那么会默认装载 @SpringBootConfiguration 注解标注的类。
提到 @SpringBootConfiguration 你可能比较陌生,其实 @SpringBootApplication 的源码里就引入了这个注解:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
excludeFilters = {@Filter(
type = FilterType.CUSTOM,
classes = {TypeExcludeFilter.class}
), @Filter(
type = FilterType.CUSTOM,
classes = {AutoConfigurationExcludeFilter.class}
public @interface SpringBootApplication {
// ...
也就是说,如果我们不指定classes属性,那么启动测试类时需要加载的Bean的数量和正常启动一次入口类(即有@SpringBootApplication注解的类)加载的 Bean 数量是一样的。
如果你的项目中有很多个 Bean, 特别是有以下几种时:
这几种类在程序初始化的过程中都会运行自身的业务代码或者初始化代码,从而延后了测试方法的运行。
在这种情况下,我们在编写测试类的时候,如果明确这个测试类会用到哪几个 Bean,则可以在 classes 属性处指定,之后启动测试类的时候,就只会加载需要的 Bean 到上下文中,从而加快启动速度。比如:
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes={HelloServiceImpl.class})
public class HelloServiceTests {
@Autowired
private IHelloService helloService;
@Test
public void testHello() {
// ...
即使此时项目中还有另外一个 Bean 在它的初始化方法里写了类似 Thread.sleep(10000) 等操作也不会影响,因为这个 Bean 根本就没有被加载和初始化。
好文章,我在看
作者:jwenjian转自:juejin.im/post/5e709f25f265da570c754d8d单元测试是项目开发中必不可少的一环,在 SpringBoot 的项目中,我们用 ...
一、Spring Boot Test介绍
Spring Test与JUnit等其他测试框架结合起来,提供了便捷高效的测试手段。而Spring Boot Test 是在Spring Test之上的再次封装,增加了切片测试,增强了mock能力。
整体上,Spring Boot Test支持的测试种类,大致可以分为如下三类:
单元测试:一般面向方法,编写一般业务代码时。涉及到的注解有@Test。
切片测试:一般面向难于测试的边界功能,介于单元测试和功能测试之间。涉及到的注解有@RunWith @WebMv
一、版本差异
Spring Boot 2.2.0 版本开始引入 JUnit 5 作为单元测试默认库,在 Spring Boot 2.2.0 版本之前,spring-boot-starter-test 包含了 JUnit 4 的依赖,Spring Boot 2.2.0 版本之后替换成了 Junit Jupiter。
pom.xml
<dependency>
<groupId>org.springframework.boot</groupId&g
一、Spring Boot Test介绍
Spring Test与JUnit等其他测试框架结合起来,提供了便捷高效的测试手段。而Spring Boot Test 是在Spring Test之上的再次封装,增加了切片测试,增强了mock能力。
整体上,Spring Boot Test支持的测试种类,大致可以分为如下三类:
单元测试:一般面向方法,编写一般业务代码时,测试成本较大。涉及到的注解有@Test。
切片测试:一般面向难于测试的边界功能,介于单元测试和功能测试之间。涉及到的注解有@RunWith
由于spring boot在启动时通常会先行启动一些内置的组件,比如tomcat。因此,spring boot的测试类一般需要加一些简单的注解。
测试类示例
@RunWith标记一个运行期SpringRunner.class(它是一个SpringJUnit4ClassRunner的子类,名字简短而已,未做任何扩展);
@SpringBootTest注解指定在测试类上用来运行基于Spr...
public class Runner implements ApplicationRunner {
@Autowired
private ZkUserService zkUserService;
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println("======
测试过程本身并不是一个复杂的过程,但是很多情况下测试时需要模拟一些线上情况,或者模拟一些特殊情况。如果当前环境按照线上环境已经设定好了,例如是下面的配置
但是你现在想测试对应的兼容性,需要测试如下配置
这个时候我们能不能每次测试的时候都去修改源码application.yml中的配置进行测试呢?显然是不行的。每次测试前改过来,每次测试后改回去,这太麻烦了。于是我们就想,需要在测试环境中创建一组临时属性,去覆盖我们源码中设定的属性,这样测试用例就相当于是一个独立的环境,能够独立测试,这样就方
### 回答1:
Spring Boot和MyBatis是两个非常流行的Java框架,它们可以很好地协同工作。Spring Boot提供了一个快速开发的框架,MyBatis则提供了一个强大的ORM框架。将它们整合在一起可以让我们更快地开发出高效的Java应用程序。
整合Spring Boot和MyBatis需要以下步骤:
1. 添加依赖:在pom.xml文件中添加Spring Boot和MyBatis的依赖。
2. 配置数据源:在application.properties文件中配置数据库连接信息。
3. 配置MyBatis:在配置类中添加MyBatis的配置信息。
4. 编写Mapper接口:创建Mapper接口,并在其中定义SQL语句。
5. 编写Mapper.xml文件:在resources目录下创建Mapper.xml文件,并在其中编写SQL语句。
6. 注册Mapper接口:在配置类中注册Mapper接口。
7. 测试:编写测试类,测试MyBatis是否正常工作。
以上就是整合Spring Boot和MyBatis的基本步骤。通过这种方式,我们可以快速地开发出高效的Java应用程序。
### 回答2:
SpringBoot是一个用于开发Java应用程序的开源框架,它提供了很多简化开发的特性。而MyBatis是一个流行的持久层框架,用于访问数据库。将SpringBoot和MyBatis进行整合,可以更加方便地开发数据库相关的应用。
首先,需要在项目的pom.xml文件中添加SpringBoot和MyBatis的依赖。然后,配置数据库连接信息,可以通过application.properties或application.yml文件进行配置。
接下来,创建实体类和Mapper接口。实体类用于映射数据库表的字段,而Mapper接口用于定义数据库操作的方法。
然后,编写Mapper接口的实现类。可以使用注解或XML文件来编写SQL语句,从而实现对数据库的增删改查操作。
在SpringBoot的启动类中,使用@MapperScan注解来扫描Mapper接口,并将其注册到Spring容器中。
最后,就可以在业务逻辑中使用@Autowired注解来注入Mapper接口的实例,从而调用数据库的操作方法。
整合完成后,可以简化数据库操作的代码,提高开发效率。同时,SpringBoot的自动配置和快速启动特性,让整合更加方便和高效。
总结起来,SpringBoot和MyBatis的整合可以帮助开发者更好地开发数据库相关的应用,提供了便捷的配置和快速的启动特性,提高开发效率。
### 回答3:
Spring Boot和MyBatis是两个非常流行的Java开发框架。Spring Boot是一个用于开发各种Java应用程序的框架,它可以使开发者更简单地搭建和配置应用程序。而MyBatis是一个流行的持久层框架,它可以帮助开发者更方便地操作数据库。
Spring Boot和MyBatis的整合过程相对简单,以下是一些主要步骤:
1. 创建一个Spring Boot项目,可以选择使用Spring Initializr进行项目的初始化。
2. 在项目的pom.xml文件中添加MyBatis和相应的数据库驱动依赖。
3. 创建一个MyBatis的配置文件,可以命名为mybatis-config.xml,用于配置MyBatis的一些全局参数和属性。
4. 创建一个数据源配置类,该类需要使用Spring Boot提供的数据源配置,以及MyBatis的参数配置。
5. 创建一个mapper接口,该接口定义了数据库操作的方法,并使用MyBatis的注解来映射SQL语句。
6. 创建对应的mapper XML文件,该文件用于编写SQL语句,并将SQL语句与mapper接口的方法进行绑定。
7. 在Spring Boot的配置文件中配置扫描mapper文件和接口的路径。
8. 在需要使用数据库操作的地方,通过@Autowired注解将mapper接口注入,并通过调用接口的方法来进行数据库操作。
整合完成后,可以通过调用mapper接口的方法来执行数据库操作,MyBatis会自动将SQL语句与相应的数据库操作进行绑定,从而实现对数据库的增删改查等操作。
总的来说,Spring Boot和MyBatis的整合过程相对简单,只需要进行一些配置和创建相应的接口和XML文件即可。这样可以充分发挥Spring Boot和MyBatis的优势,使开发者更方便地进行数据库操作。