mock 单元测试 mockmvc详解

mock(模拟)

依赖于spring的框架和spring的环境

切片测试:指用mockmvc测试controller层,模拟返回service层的值,将层与层间的联系断开。

集成测试:指用mockmvc测试controller层,但不间隔service层。将controller层和service层集合起来测试。

java的单元测试框架有junit、mockMvc等

java的mock框架一般有Mockito、EasyMock、powerMock等(框架用来提供mock的工具,用于mock的打桩和断言)

springMVC的测试中,一般采用mockMvc+Mockito的组合来进行mock模拟测试 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,classes = Application.class)   <br>@ContextConfiguration(loader = SpringBootContextLoaderEx.class)
public class ControllerTestJuint extends BaseJunit{  
private MockMvc mockMvc;
     @Autowired
     protected WebApplicationContext wac;
 
    // mock的对象,stationService被mockbean注解之后,会自己注入到容器当中,stationService中的所有方法除开被打桩返回的,其余调用时,都返回null
    @MockBean
    private StationService stationService;     
 
     @Before()  //这个方法在每个方法执行之前都会执行一遍
     public void setup() {
     mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();  //初始化MockMvc对象
       SecurityUtils.setSecurityManager(wac.getBean(SecurityManager.class);
     }<br>
  @Test
  public void mockTest() throws Exception{
     // 打桩,给指定方法返回值
     when(stationService.add(any(),any())).thenReturn(true);
     // 给返回值为void的方法打桩
     doNothing.when(stationService).updateService(any());
 
        ResultActions reaction = this.mockMvc.perform(MockMvcRequestBuilders.post("/sys/out/mockTest")
               .contentType(MediaType.APPLICATION_JSON)//请求体时json
               .param("customerId","7")
               .param("serviceType","all_service")
               .param("params[company_id]","1110000")//组装map对象
               .param("params[AGE]","0,5"))
          .anddo(MockMvcResultHandlers.print())  // 控制台打印出请求体
               );
        reaction.andExpect(MockMvcResultMatchers.status().isOk());
        MvcResult mvcResult =reaction.andReturn();
        System.out.println(mvcResult.getResponse().getContentAsString());
        TimeUnit.SECONDS.sleep(60*60);
     }
 }

thenReturn 中可以指定多个返回值。在调用时返回值依次出现。若调用次数超过返回值的数量,再次调用时返回最后一个返回值

mockito不支持对静态(static)方法进行打桩。可以使用PowerMock对静态方法进行打桩

1
PowerMockito.mockStatic(AmountUtil.class);<br>PowerMockito.when(AmountUtil.CustomFormatWith2Digits(anyInt())).thenReturn("zzzz");

对mvc的controller层进行测试,使用Mockmvc

对普通方法进行单元测试,使用junit

普通方法也能进行mock,使用junit+mockitor

普通方法测试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Test
public void testBubbleSort() {
         
    Node node1 = new Node(1);
    Node node2 = new Node(2);
    Node node3 = new Node(3);
 
    Node[] nodes = {node1,node2,node3};
         
    bubbleSort.bubbleSort(nodes);
    Assert.assertEquals(3, nodes[0].getValue()); // 断言,验证测试的正确性
    Assert.assertEquals(2, nodes[1].getValue());
    Assert.assertEquals(1, nodes[2].getValue());
}

mockitor 可以使用verify来验证方法的调用次数

posted @   wangssd  阅读(6648)  评论(0编辑  收藏  举报
编辑推荐:
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
阅读排行:
· ThreeJs-16智慧城市项目(重磅以及未来发展ai)
· 软件产品开发中常见的10个问题及处理方法
· Vite CVE-2025-30208 安全漏洞
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(四):结合BotSharp
· MQ 如何保证数据一致性?
点击右上角即可分享
微信分享提示