只是简单介绍与说明,不喜勿喷,基本上这几个示例就够用了
导入依赖
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
–> MockMVC 说明:
MockMvc 是springTest提供的对SpringMvc提供的测试工具。这样可以让单元测试不仅仅局限于对Dao和Service 层的测试。同时,也可以测试Controller层。丰富的单元测试的功能。测试时不用频繁重启servlet容器,简化了测试操作。
MockMvc需要ServletContext来**模拟用户的请求和响应**。
加载整个服务(包括数据库操作)
使用到的注解:
@RunWith(SpringRunner.class) 该注解为类级别批注,该注解的作用是告诉java这个类是以什么运行环境来运行
@SpringBootTest 启动spring容器,用来指定springboot应用程序的入口类,该注解会根据包名逐级向上查找,一直找到一个springboot的主程序为止,然后启动该类为单元测试准备spring上下文环境,参数是启动类的字节码文件
@Resource 注入所需资源(这里注入了Http请求所需要的参数列表)
@before的作用就是在一个类中最先执行的方法
@after的作用就是在一个类中最后执行的方法
实现:
* 1、mockMvc.perform执行一个请求。
* 2、MockMvcRequestBuilders.get("XXX")构造一个请求。 或者 .post("xxx")
* 3、ResultActions.param添加请求传值。 或者 .content("xxx")
* 4、ResultActions.accept[əkˈsept] (MediaType.APPLICATION_JSON_UTF8_VALUE))设置返回类型
* 5、ResultActions.andExpect添加执行完成后的断言。 (判断结果是否达到预期)
* 6、ResultActions.andDo添加一个结果处理器,表示要对结果做点什么事情 比如此处使用MockMvcResultHandlers.print()输出整个响应结果信息。
* 7、ResultActions.andReturn表示执行完成后返回相应的结果。
MockMVC 代码示例:
@RunWith(SpringRunner.class)
@SpringBootTest
public class xxxTest {
private MockMvc mockMvc;
//注入spring容器
@Resource
private WebApplicationContext context;
@Before
public void setUp() throws Exception {
//初始化 MockMvc 对象
mockMvc = MockMvcBuilders.webAppContextSetup(context).build();
System.out.println("开始");
}
@After
public void main() {
System.out.println("结束");
}
@Test //有请求头、无参数的get请求
public void testHello() throws Exception {
ResultActions perform = mockMvc.perform(MockMvcRequestBuilders.get("/api/test")
.accept(MediaType.APPLICATION_JSON_UTF8_VALUE));
perform.andExpect(MockMvcResultMatchers.status().isOk());
perform.andExpect(MockMvcResultMatchers.content().string("0"));
perform.andDo(MockMvcResultHandlers.print());
MvcResult mvcResult = perform.andReturn();
System.out.println(mvcResult.getHandler());
System.out.println(mvcResult.getRequest());
System.out.println(mvcResult.getResponse());
System.out.println(mvcResult.getInterceptors());
}
@Test //有请求头、无参数的Post请求
public void xxxApi() throws Exception {
String jsonRequest = RequestJson.getJson();//请求是什么就组装什么参数
ResultActions perform = this.mockMvc.perform(MockMvcRequestBuilders.post("/api/xxxx")
.accept(MediaType.APPLICATION_JSON_UTF8_VALUE)
.content(jsonRequest)
);
perform.andExpect(MockMvcResultMatchers.status().isOk());
perform.andExpect(MockMvcResultMatchers.content().contentType(MediaType.APPLICATION_JSON_UTF8_VALUE));
perform.andDo(MockMvcResultHandlers.print());
}
@Test //有请求头、有参数的get请求
public void test() throws Exception {
ResultActions perform = mockMvc.perform(MockMvcRequestBuilders.post("/api/test")
.param("test","test"));
perform.andExpect(MockMvcResultMatchers.status().isOk());
perform.andDo(MockMvcResultHandlers.print());
MvcResult mvcResult = perform.andReturn();
System.err.println(mvcResult.getHandler());
System.err.println(mvcResult.getRequest());
System.err.println(mvcResult.getResponse());
System.err.println(mvcResult.getInterceptors());
}
}
–> Mock 说明:
@RunWith(SpringRunner.class) 该注解为类级别批注,该注解的作用是告诉java这个类是以什么运行环境来运行
@Mock:创建一个Mock。
@InjectMocks:创建一个实例,其余用@Mock(或@Spy)注解创建的mock将被注入到用该实例中。
java: @Autowird / @Resource 等方式完成自动注入。
在单元测试中,没有启动 spring 框架,此时就需要通过 @InjectMocks完成依赖注入。
@InjectMocks会将带有@Spy 和@Mock 注解的对象尝试注入到被 测试的目标类中。
Assertions: 断言
* 是测试方法中的核心部分,用来对测试需要满足的条件进行验证。这些断言方法都是 org.junit.jupiter.api.Assertions 的静态方法。
* assertEquals 判断两个对象或两个原始类型是否相等
* assertNotEquals 判断两个对象或两个原始类型是否不相等
* assertSame 判断两个对象引用是否指向同一个对象
* assertNotSame 判断两个对象引用是否指向不同的对象
* assertTrue 判断给定的布尔值是否为
* trueassertFalse 判断给定的布尔值是否为
* falseassertNull 判断给定的对象引用是否为 null
* assertNotNull 判断给定的对象引用是否不为 null
* assertThrows 判定调用某方法是否触发该异
Mock 代码示例:
例如:预置返回的结果(将 xxxRepository.save() 的返回值为 yy)
import static org.mockito.Mockito.when;
when(xxxRepository.save(Mockito.any())).thenReturn(yy);
例如:逻辑忽略(将 xxxServiceImpl.xxxation() 忽略,不执行)
import static org.mockito.Mockito.doNothing;
doNothing().when(xxxServiceImpl).xxxation(Mockito.anyString());
----------------------------------------
Mockito.any() --> 参数
Mockito.anyString() --> 参数
@RunWith(SpringRunner.class)
public class xxxTest {
@InjectMocks
private xxxServiceImpl xxxServiceImpl;
@Mock
private xxxRepository xxxRepository;
@Test
public void testAll() {
List<JSONObject> json = getJson();
List<xxx> list = new ArrayList<xxx>();
list.add(new xxx());
when(xxxRepository.findByxxx(Mockito.any())).thenReturn(list);
String s = xxxServiceImpl.xxxxxx(json);
Assertions.assertNotNull(s);
}
@Test
public void testAll() {
List<xxx> xxx= xxxxServiceImpl.xxxxx(参数结构);
Assertions.assertEquals(1, xxxResults.size());//断言
}
}