欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【kotlin】Spring boot controller 如何做单元测试???

程序员文章站 2022-04-29 16:40:07
...

如果你需要测试的控制器有forward,请看看这里,了解如何测试

使用集成web环境进行测试,请使用如下方法创建MockMvc

@Autowired private lateinit var indexViewAction: indexViewAction
private lateinit var mockMvc: MockMvc

@Before
fun before(){
    mockMvc = MockMvcBuilders
            .standaloneSetup(indexViewAction)
            .build()
}

注入你需要的controller,然后将其放入standaloneSetup

这种是使用独立测试方法进行

首先,我们先准备一个要做单元测试的类,更详细的在post和get的带方法测试上,可以直接翻到最后

@RunWith(SpringRunner::class)
/@SpringBootTest(classes = [Application::class]) 需要配外的配置/
@SpringBootTest /* 不需要格外的配置 */
class IndexViewTest {

private lateinit var mockMvc: MockMvc
@Autowired
private lateinit var webApplicationContext: WebApplicationContext

@Before
fun init(){
    /*创建一个mock mvc*/
    mockMvc = MockMvcBuilders
            .webAppContextSetup(webApplicationContext)
            .build()
}

}

想必大家看到了MockMvcBuilders,这个类是用来帮助我们创建一个MockMvc的,name什么是MockMvc了

// 这个是MockMvc的文档描述,提供spring mvc的测试支持

/**

  • Main entry point for server-side Spring MVC test support.
  • Example

  • 
    
  • import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
  • import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
  • import static org.springframework.test.web.servlet.setup.MockMvcBuilders.*;
  • // …
  • WebApplicationContext wac = …;
  • MockMvc mockMvc = webAppContextSetup(wac).build();
  • mockMvc.perform(get("/form"))
  • .andExpect(status().isOk())
  • .andExpect(content().mimeType(“text/html”))
  • .andExpect(forwardedUrl("/WEB-INF/layouts/main.jsp"));
  • @author Rossen Stoyanchev
  • @author Rob Winch
  • @author Sam Brannen
  • @since 3.2
    */
    现在我们可以开始测试了,先来简单的测试一个get post方法

@RunWith(SpringRunner::class)
/@SpringBootTest(classes = [Application::class]) 需要配外的配置/
@SpringBootTest /* 不需要格外的配置 */
class IndexViewTest {

private lateinit var mockMvc: MockMvc
@Autowired
private lateinit var webApplicationContext: WebApplicationContext

@Before
fun init(){
    /*创建一个mock mvc*/
    mockMvc = MockMvcBuilders
            .webAppContextSetup(webApplicationContext)
            .build()
}

/*使用get测试*/
@Test
fun get(){
    mockMvc
            .get("/index.html") /*指定get方法要使用的url地址*/
            .andReturn() /*返回结果*/
            .response /*返回内容*/
            .contentAsString /*内容作为html形式*/
            .apply(::println) /*打印结果*/
}

/*使用post测试*/
@Test
fun post(){
    mockMvc
            .post("/index.html") /*指定get方法要使用的url地址*/
            .andReturn() /*返回结果*/
            .response /*返回内容*/
            .contentAsString /*内容作为html形式*/
            .apply(::println) /*打印结果*/
}

}
但是很多时候,我们的测试哪里有这么简单,一般都是带参数的,那么带参数要如何测试呢

重点,这个才是重点

@RunWith(SpringRunner::class)
/@SpringBootTest(classes = [Application::class]) 需要配外的配置/
@SpringBootTest /* 不需要格外的配置 */
class IndexViewTest {

private lateinit var mockMvc: MockMvc
@Autowired
private lateinit var webApplicationContext: WebApplicationContext

@Before
fun init(){
    /*创建一个mock mvc*/
    mockMvc = MockMvcBuilders
            .webAppContextSetup(webApplicationContext)
            .build()
}

/*使用get测试*/
@Test
fun get(){
    mockMvc
            .get("/index.html") /*指定get方法要使用的url地址*/
            .andReturn() /*返回结果*/
            .response /*返回内容*/
            .contentAsString /*内容作为html形式*/
            .apply(::println) /*打印结果*/
}

/*使用post测试*/
@Test
fun post(){
    mockMvc
            .post("/index.html") /*指定get方法要使用的url地址*/
            .andReturn() /*返回结果*/
            .response /*返回内容*/
            .contentAsString /*内容作为html形式*/
            .apply(::println) /*打印结果*/
}

/*带参数的get测试*/
@Test
fun getAndParam(){
    mockMvc
            .perform(
                    MockMvcRequestBuilders.get("/index.html")/*设置url地址*/
                            .param("page","1")/*设置参数*/
                            .cookie(Cookie("name","lemon"))/*设置cookie*/
                            .header("username","lemon")/*设置请求头*/
            /*当然还可以设置很多东西,按.就可以看到了*/
            )
            .andExpect ( /*设置成功条件*/
                matchAll( /* 这是一个静态方法,它的返回值刚好就是andExpect需要的参数*/
                        status().isOk, /*这是静态方法,判断返回类型*/
                        header().exists("Content-Type"), /*这也是静态方法,判断头里面是不是有指定的头,只包含你自己添加的头,不包括默认头(也就是哪些不是你设置的头)*/
                        content().encoding("utf-8") /*判断返回的编码*/
                )
            )
            .andReturn() /*返回结果*/
            .response /*返回内容*/
            .contentAsString /*内容作为html形式*/
            .apply(::println) /*打印结果*/
}

/*带参数的post测试*/
@Test
fun postAndParam(){
    mockMvc
            .perform(
                    MockMvcRequestBuilders.post("/index.html")/*设置url地址*/
                            .param("page","1")/*设置参数*/
                            .cookie(Cookie("name","lemon"))/*设置cookie*/
                            .header("username","lemon")/*设置请求头*/
                    /*当然还可以设置很多东西,按.就可以看到了*/
            )
            .andExpect ( /*设置成功条件*/
                    matchAll( /* 这是一个静态方法,它的返回值刚好就是andExpect需要的参数*/
                            status().isOk, /*这是静态方法,判断返回类型*/
                            header().exists("Content-Type"), /*这也是静态方法,判断头里面是不是有指定的头,只包含你自己添加的头,不包括默认头(也就是哪些不是你设置的头)*/
                            content().encoding("utf-8") /*判断返回的编码*/
                    )
            )
            .andReturn() /*返回结果*/
            .response /*返回内容*/
            .contentAsString /*内容作为html形式*/
            .apply(::println) /*打印结果*/
}

}
注意注意,如果你要是报错了之后再来看 的话,更加要注意

import org.springframework.test.web.servlet.ResultMatcher.matchAll
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders
import org.springframework.test.web.servlet.result.MockMvcResultMatchers.*
这些东西一定要引入

spring boot的接口测试进一步说明

感谢:小站