单元测试–测试RestFul 接口
– 测试用例类使用@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)修饰。
– 测试用例类会接收容器依赖注入TestRestTemplate这个实例变量。
– 测试方法可通过TestRestTemplate来调用RESTful接口的方法。
测试用例应该定义在和被测试类位于同一个包位置。
// 测试用例的位置要和被测试的位于同一个包路径位置。
//参数webEnvironment web环境,RANDOM_PORT表示随机端口
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class BookControllerTest {
//测试用例类会接收容器依赖注入TestRestTemplate这个实例变量
@Autowired
private TestRestTemplate testRestTemplate;
//注意点:测试的时候,对应的方法的参数列表要加上注解@RequestBody,不然这个book实体传到方法那边,方法无法接收,会变成null。
//单次测试
@Test
public void testAddBookRestful(){
//生成测试数据
Book book = new Book("mysql", new BigDecimal(100), "ljh");
//参数1:访问的路径,参数2:测试的数据,参数3:获取服务器响应的数据类型,就是方法的返回值类型
Book b = testRestTemplate.postForObject("/books", book, Book.class);
//断言 参数1:期望值 , 参数2:实际值
Assertions.assertEquals("mysql",b.getName());
Assertions.assertEquals(BigDecimal.valueOf(100),b.getPrice());
Assertions.assertEquals("ljh",b.getAuthor());
}
//参数化测试,可以让方法进行多次测试
@ParameterizedTest //允许测试方法接收参数进行测试,和注解 @CsvSource 一起使用,@CsvSource注解用来写参数数据
//参数是一个数组,数组里面的每一个元素就是方法的参数
@CsvSource({"书籍A,100,ljh","书籍B,110,ljh","书籍C,120,ljh"})
public void testAddBookRestful02(String name,BigDecimal price,String author){
//生成测试数据
Book book = new Book(name, price, author);
//测试
Book b = testRestTemplate.postForObject("/books", book, Book.class);
//断言
Assertions.assertEquals(name,b.getName());
Assertions.assertEquals(price,b.getPrice());
Assertions.assertEquals(author,b.getAuthor());
}
}
解释:
注意点1:
涉及注解:@RequestBody
测试的时候,被测试的方法的参数列表要加上注解@RequestBody,不然这个book实体传到被测试方法那边,方法的参数无法接收,会变成null。
单次测试添加图书:
多次测试添加图书:
涉及到注解:
1、@ParameterizedTest 表示这个测试是参数化测试,junit5 才有的注解
//允许测试方法使用参数进行测试,
和注解 @CsvSource 一起使用,@CsvSource注解用来写参数数据
2、@CsvSource({“书籍A,100,ljh”,“书籍B,110,ljh”,“书籍C,120,ljh”})
//参数是一个数组,数组里面的每一个元素就是方法的参数,每个元素里面的多个参数用逗号隔开
测试查询方法
测试删除
涉及的注解:
@ParameterizedTest //表明这个测试方法属于参数测试
@ValueSource(ints = {76, 77, 78}) //具体参数