• Spring Boot 单元测试



    在pom添加如下依赖:

    <dependency>
    	<groupId>org.springframework.boot</groupId>
    	<artifactId>spring-boot-starter-test</artifactId>
    </dependency>
    

    测试依赖范围

    如果使用spring-boot-starter-test 'Starter’来测试,就会发现提供的以下测试库:

    • JUnit,标准的单元测试Java应用程序。
    • Spring Test&Spring Boot Test,对Spring Boot应用程序的单元测试。
    • Mockito,Java mocking框架,用于模拟任何Spring管理的Bean,比如在单元测试中模拟一个第三方系统Service接口返回的数据,而不会真正调用第三方系统。
    • Assert,一个流畅的assertion库,同时也提供了更多的期望值与测试返回值的比较方式。
    • Hamcrest,库的匹配对象。
    • JSONassert,对JSON对象或者JSON字符串断言的库。
    • JsonPath,提供类似XPath那样的符号来获取JSON数据片段。

    Spring Boot测试脚手架

    Spring Boot使用一系列注解来增强单元测试以支持Spring Boot测试,通常Spring Boot单元测试有:

    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class UserServiceTest{
    	@Autowired
    	UserService userService;
    
    	@Test
    	public void testService(){
    
    	}
    }
    

    @RunWith是Junit标准的一个注解,告诉Junit单元测试框架不要使用内置的方式进行单元测试,而使用RunWith指明的类来提供单元测试,所有的Spring单元测试总是使用SpringRunner.class。

    @SpringBootTest用于Spring Boot应用测试,它默认会根据包名逐级往上找,一直找到Spring Boot主程序,也就是通过类注解是否包含@SpringBootApplication来判断是否是主程序,并在单元测试的时候启动该类来创建Spring上下文环境。

    测试Service

    Spring 引入了@Sql,在测试前执行一系列的SQL脚本来初始化数据。

    Service单元测试的脚手架:

    @RunWith(SpringRunner.class)
    @SpringBootTest
    @Transactional
    public class ServiceTest {
    	@Autowired
    	UserService userService;
    
    	@Test
    	public void testService() {
    		int userId = 10;
    		int expectedCredit = 100;
    		given(this.creditSystemService.getUserCredit(anyInt())).willReturn(expectedCredit);
    		//given是Mockito的一个静态方法,用来模拟一个Service方法调用返回,anyInt()指示了可以出阿奴任何参数,willReturn说明这个调用将返回100。
    		int credit = userService.getCredit(10);
    		assertEquals(expectedCredit,credit);
    	}
    }
    

    因为单元测试不能实际调研第三方系统,因此,我们在单元测试类中使用了@MockBean:

    @MockBean
    private CreditSystemService service;
    

    注解@MockBean可以自动注入Spring管理的Service,用来提供模式实现。

    测试MVC

    Spring Boot可以单独测试Controller代码,用来验证与Controller相关的URL路径映射、文件上传、参数绑定、参数校验等特性。可以通过@WebMvcTest来完成MVC单元测试,脚手架如下:

    @RunWith(SpringRunner.class)
    @WebMvcTest(UserController.class)
    public class UserControllerTest {
    	@Autowired 
    	private MockMvc mvc;
    
    	@MockBean
    	UserService userService;
    
    	@Test
    	public void testMvc() throws Exception{
    	int userIf = 10;
    	int expectedCredit = 100;
    	given(this.userService.getCredit(userId)).willReturn(100);
    	//MVC调用
    	mvc.perform(get("/user/{id}",userId))
    		.andExpect(content().string(String.valueOf(expectedCredit)));
    	}
    }
    

    @WebMvcTest表示这是一个MVC测试,其参数可以传入多个待测试的Controller类。
    MockMvc是Spring提供的专门用于测试SpringMVC类。
    @MockBean用来模拟实现。
    perform完成一次MVC调用,Spring MVC Test 是Servlet容器内的一种模拟测试,实际上并不会发起一次真正的HTTP调用。
    get方法模拟了一次Get请求,。
    andExpect表示请求期望的返回结果,比如返回的内容或者HTTP响应头等。

    在Spring MVC Test中,带有@Serivce、@Conponent的类不会自动被扫描注册为Spring容器管理的Bean。
    
  • 相关阅读:
    mysql access denied for user root Mysql用户无权限
    远程链接调用sql脚本
    CuteEditor使用详解
    如何设置release模式
    ShardingJDBC不分库,只分表例子
    SpringCloud Stream整合RocketMQ实现消息发送与接收
    Spring Cloud Gateway的PrefixPath及StripPrefix功能
    使用MongoDB的Spring Boot和MongoTemplate教程
    ShardingJDBC读写分离案例
    SpringBoot那些好用的连接池HikariCP
  • 原文地址:https://www.cnblogs.com/aixing/p/13327473.html
Copyright © 2020-2023  润新知