Spring Boot Testing
(1)依赖:spring-boot-starter-test
(2)包括:Junit、Spring Test、AssertJ
Test Case
(1)要求:保证测试方法的独立性
(2)步骤:初始化数据、执行测试代码、验证测试结果、清理测试数据。
(3)常用注解:@BeforeClass(在类初始化之前)、@AfterClass、@Before(每调一个测试方法前)、@After(每调一个测试方法后)。
新建SpringBootTests类,
// 对类,对这个类只调用一次
@BeforeClass
public static void beforeClass(){
System.out.println("beforeClass");
}
@AfterClass
public static void afterClass(){
System.out.println("afterClass");
}
//对方法,对每个方法都调用
@Before
public void before(){
System.out.println("before");
//初始化测试数据(作为类的成员变量) //这种初始化方式(放在before里)效率比较低,但独立性比较好
data = new DiscussPost();
data.setUserId(111);
data.setTitle("Test Title");
data.setContent("Test Content");
data.setCreateTime(new Date());
discussPostService.addDiscussPost(data);
}
@After
public void after(){
System.out.println("after");
//每次方法后,删除测试数据
discussPostService.updateStatus(data.getId(),2);
}
@Test
public void test1(){
System.out.println("test1");
}
@Test
public void test2(){
System.out.println("test2");
}
若选中整个类(即右键SpringBootTests运行),可以看到test1和test2前后都有before和after,而BeforeClass和AfterClass是只出现一次。
再添加
@Test
public void testFindById(){
DiscussPost post = discussPostService.findDiscussPostById(data.getId());
Assert.assertNotNull(post); //先判断这个数据是不是非空
Assert.assertEquals(data.getTitle(),post.getTitle()); //帖子题目是否一致
Assert.assertEquals(data.getContent(),post.getContent()); //帖子内容是否一致,其实也可以把DiscussPost的toString方法改写一下,然后用equals比较两个对象是否相等
}
@Test
public void testUpdateScore(){
int rows = discussPostService.updateScore(data.getId(),2000);
Assert.assertEquals(1,rows); //判断修改行数是否等于1
DiscussPost post = discussPostService.findDiscussPostById(data.getId());
Assert.assertEquals(2000,post.getScore(),2); //改完分数后,判断是否修改成了2000。判断两个小数,需要传入第三个参数:精度
}
before和after方法的缺点是效率比较低(每次都要运行),但好处是不用依赖“别人”,可以独立运行测试。
需要注意的是testFindById方法和testUpdateScore方法都引用了data这个变量名,但是它们引用的对象是不同的(因为每个方法调用前后,都新建和删除了data对象)。