其他分享
首页 > 其他分享> > SpringBoot+junit测试记录

SpringBoot+junit测试记录

作者:互联网

IDEA自动生成测试类 选中想要生成测试的类然后使用快捷键 ctrl+shift+t进行生成测试类

SpringBoot+junit4 对Service层这样基础的类进行测试
需要在测试类的上面添加两个注解
@RunWith(SpringRunner.class)
@SpringBootTest
有了这两个注解以后 测试类就能使用spring提供的各种强大的功能,使用@Autowire获取容器中的Bean等
在测试类上标注@Transactional注解则表示所有对数据库进行操作都会回滚不会因为测试类的数据污染数据库,但是即使回滚对于自增主键不会变小,

而且这个注解只在@RunWith(SpringRunner.class)的值为SpringRunner.class时才会起作用,其他的Runner不会回滚
标完这三个注解后就可以愉快的获取容器中的bean和断言进行测试了。(我不知道这种情况没有配置文件会不会有影响,待会开个新工程试一试,不过我猜很大可能是没有影响)

springBoot+Junit4 进行参数化测试(就是一个测试方法测试一组数据)
看一个官方的例子就明白怎么用了
官方文档中的例子:

@RunWith(Parameterized.class)
public class FibonacciTest
{
@Parameters
public static Collection data()
{
return Arrays.asList(new Object[][] { { 0, 0 }, { 1, 1 }, { 2, 1 },
{ 3, 2 }, { 4, 3 }, { 5, 5 }, { 6, 8 } });
}

private int fInput;
private int fExpected;

public FibonacciTest(int input, int expected)
{
fInput = input;
fExpected = expected;
}

@Test
public void test()
{
assertEquals(fExpected, Fibonacci.compute(fInput));
}
}

 

其中最主要的是@RunWith(Parameterized.class) 使用的Parameterized.class这个runner,@Parameters这个注解标注的方法是就是一系列测试参数和期望值的集合,然后通过构造函数将这个集合中的数据一次放进测试类中

可以看到 参数化测试和SpringBoot用的不是一个Runner,而且RunWith注解只能标注一次,所以在使用参数化测试时就没有上面那么方便的获得spring容器了,而且也不能使用@Transactional注解进行方便的回滚,不过也有办法
在测试类中添加

@Before
public void prepare() throws Exception {
//果然是配置文件的问题
TestContextManager testContextManager = new TestContextManager(getClass());
testContextManager.prepareTestInstance(this);
//我猜这两句话是启动SpringBoot }

要注意使用这种方法启动时要把SpringBoot的配置文件赋值一份放到Test的资源文件夹中,而且SpringBoot是按照Test中配置来启动的(SSM那种的怎样测试啊?),我想应该是classpath变成test的资源目录,
如果使用Mybatis的话要把Mapper文件也放到test资源文件夹中的相应位置。
还要解决不回滚的问题
因为网上大部分都是直接用@Transactional注解的,所以在网上没找到好的解决方法,就想了一个野路子,直接获取Spring中的TransactionManager,然后手动开启事务,手动进行回滚操作,这个野路子目前是可行的。
这是一个简单的测试代码

 1 @RunWith(Parameterized.class)
 2 //@RunWith(SpringJUnit4ClassRunner.class)
 3 @SpringBootTest
 4 public class UserServiceImplTest extends AbstractTransactionalJUnit4SpringContextTests {
 5 @Autowired
 6 UserService userService;
 7 @Autowired
 8 DataSourceTransactionManager dataSourceTransactionManager;
 9 private User user;
10 private CommonResult<RegisterResult> exceptedResult;
11 @Before
12 public void prepare() throws Exception {
13 //果然是配置文件的问题
14 TestContextManager testContextManager = new TestContextManager(getClass());
15 testContextManager.prepareTestInstance(this);
16 }
17 
18 @Parameterized.Parameters
19 public static List prepareData(){
20 return Arrays.asList(new Object[][]{{new User("ly","1234@ly.cn","1234567"),new CommonResult<RegisterResult>(0,"OK",new RegisterResult(1,"ly","1234@ly.cn"))}
21 ,{new User(null,"12345@ly.cn","1234567"),new CommonResult<RegisterResult>(0,"OK",new RegisterResult(1,"12345","12345@ly.cn"))}
22 ,{new User(null,"test@qq.com","1234567"),new CommonResult<RegisterResult>(-20621,"邮箱重复",null)}
23 });
24 }
25 
26 public UserServiceImplTest(User user,CommonResult<RegisterResult> exceptedResult){
27 this.user = user;
28 this.exceptedResult = exceptedResult;
29 }
30 
31 @Test
32 public void registerAccount() {
33 //你自己不给我提供回滚,我自己来还不行吗
34 //定义一个事务
35 DefaultTransactionDefinition def = new DefaultTransactionDefinition();
36 //获取事务状态
37 TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(def);
38 
39 CommonResult<RegisterResult> registerResultCommonResult = userService.registerAccount(this.user);
40 assertEquals(exceptedResult,registerResultCommonResult);
41 //进行回滚
42 dataSourceTransactionManager.rollback(transactionStatus);
43 //还有一个小瑕疵就是自增的主键无法回滚
44 }
45 
46 }

SpringBoot 对Controller进行测试
这个就是用MockMvc进行测试,教程网上一搜一大把
这里就简单的贴个代码

@RunWith(SpringRunner.class)
@SpringBootTest
@Transactional
public class UserControllerTest {
@Autowired
WebApplicationContext webApplicationContext;


private MockMvc mockMvc;
private MockHttpSession session;

@Before
public void setupMockMvc(){
mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
session = new MockHttpSession();
//session现在还用不到
}
public UserControllerTest(){

}
@Test
public void registerAccount() throws Exception {
MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders.post("/user/registerAccount").param("displayName", "123").param("email", "123456789@qq.com")
.param("password", "123456")).andReturn();
System.out.println();
JSONObject jsonObject = JSONObject.parseObject(mvcResult.getResponse().getContentAsString());
assertEquals(0,jsonObject.get("code"));
assertEquals("OK",jsonObject.get("message"));
assertEquals("123",((Map)jsonObject.get("body")).get("displayName"));
assertEquals("123456789@qq.com",((Map)jsonObject.get("body")).get("email"));
}
}

 

标签:RunWith,SpringBoot,junit,class,测试,注解,new,public
来源: https://www.cnblogs.com/liuyangffff/p/14341231.html