在SpringBoot中集成单元测试
在SpringBoot中集成单元测试
在Springboot中集成单元测试⼊门很简单,这⾥做个简单的记录,后续会针对不同的单元测试场景不断进⾏完善和记录,希望给需要的⼈⼀点帮助。
引⼊相应的依赖
在SprintBoot中引⼊单元测试依赖包很简单,⼀般在创建SpringBoot项⽬的时候就会⾃⾏引⼊单元测试的依赖包。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
该依赖在引⼊时如果带上了exclusions的说明,需要根据情况⾃⾏删除。
⼊门⽰例
我们创建⼀个⼊门的Springboot项⽬(啥业务逻辑都没有!),我们以Service层为例,创建⼀个Service的服务TestService,然后定义两个业务⽅法,具体如下:
package com.majing.learning.springboot.junit.service;
import org.springframework.stereotype.Service;
@Service
public class TestService {
public void method1(){
System.out.println("TestService -> method1");springboot是啥
}
public void method2(){
System.out.println("TestService -> method2");
}
}
接下来看怎么对上⾯的TestService进⾏测试。
如果你⽤的是IDEA,那么创建单元测试很⽅便,如下图所⽰:
这样在src/test/java下就会⽣成⼀个单元测试类,相应的⽬录结构和src/main/java中的包名相同。
相应的测试类TestServiceTest的实现如下。
package com.majing.learning.springboot.junit.service;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.jupiter.api.*;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired; import org.st.context.SpringBootTest; import st.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
class TestServiceTest {
@Autowired
private TestService testService;
@BeforeAll
public static void beforeAll() {
System.out.println("TestServiceTest -> @BeforeAll");
}
@AfterAll
public static void afterAll() {
System.out.println("TestServiceTest -> @AfterAll");
}
@AfterEach
void tearDown() {
System.out.println("TestServiceTest -> @AfterEach");
}
@BeforeEach
void setUp() {
System.out.println("TestServiceTest -> @BeforeEach");
}
@Test
void method1() {
}
@Test
void method2() {
}
}
运⾏结果如下:
在上⾯的测试⽤例中,⽤了⼏个注解,@BeforeAll,@AfterAll,@BeforeEach,@AfterEach,@Test。
需要说明的是,最开始我⽤@Before,@After,@BeforeClass,@AfterClass,想实现在这个测试类的所有测试⽅法前/后执⾏,但是发现都没有实现。后来发现要实现这样的功能,需要使⽤@BeforeAll,@AfterAll这两个注解。如上图结果所
⽰,@BeforeAll,@AfterAll,这两个注解只被执⾏了⼀次,符合期望。
单元测试事务回滚
在业务代码中,难免会操作数据库。为了不影响数据库的数据,需要在单元测试完成之后,将数据库操作进⾏回滚。
这在springboot中也是很容易解决的事情,只需要将单元测试类继承AbstractTransactionalJUnit4SpringContextTests即可。
⾸先看下没有继承时的效果,我们先定义⼀个简单的数据库操作类,数据库只有⼀个简单的⽅法add,该⽅法⽤于向数据库表city中插⼊⼀条数据。这⾥只是简单的演⽰。
⾸先在springboot中添加mysql配置项
#mysql配置
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.sql.cj.jdbc.Driver
spring.datasource.max-idle=10
spring.datasource.max-wait=10000
spring.datasource.min-idle=5
spring.datasource.initial-size=5
然后编写dao层的逻辑,简单的执⾏⼀条插⼊命令:
package com.majing.learning.springboot.junit.dao;
import org.springframework.beans.factory.annotation.Autowired;
import org.JdbcTemplate;
import org.springframework.stereotype.Repository;
@Repository
public class CityDao {
@Autowired
private JdbcTemplate jdbcTemplate;
public void add(){
}
然后针对这个CityDao进⾏单元测试。
package com.majing.learning.springboot.junit.dao;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.st.context.SpringBootTest;
import st.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
class CityDaoTest {
@Autowired
private CityDao cityDao;
@BeforeEach
void setUp() {
}
@AfterEach
void tearDown() {
}
@Test
void add(){
cityDao.add();
}
}
执⾏这个单元测试类前后,数据表的数据分别如下:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。