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

如果你需要测试的控制器有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的接口测试进一步说明

感谢:更多内容

你可能感兴趣的:(JAVA,kotlin,mockmvc)