在一个Javaspring+mybit+maven框架中,增加Junit测试类。
在测试类中遇到的一些问题,利用spring 框架时,里面已经有保密security+JWT设定的场合,在你的security文件中,添加你的URI路径,且确保完全一致,缺省的话是不可以的。
例如:
URI:aaaaa/bbb security文件中定义:aaaaa/** 的场合,测试类访问的时候会出现错误status:302
这种场合你就要尝试利用完全一致的写法来试验一下。
系统:window7
1.首先在配置文件pom.xml文件中添加测试类的包文件,之后执行maven取得相对应的包文件到本地
<dependency><!-- JUnit单元测试框架 --> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <dependency><!-- spring对测试框架的简单封装功能 --> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> <scope>test</scope> </dependency> <dependency> <!--- mock追加-> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <version>1.9.5</version> <scope>test</scope> </dependency>
测试类
场合1:当你的Controller里面没有用到session
package com.cnc.mht; import static org.mockito.Mockito.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.http.MediaType; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext; import java.util.List; import java.util.Map; import com.cnc.mht.web.http.RequestUtil; import com.cnc.mht.web.weixin.dto.ImsWcyMakeAnAppointment; import net.sf.json.JSONObject; @SpringBootTest @RunWith(SpringJUnit4ClassRunner.class) public class SpringJunitTest { @Autowired private WebApplicationContext webApplicationContext; private MockMvc mockMvc; @Autowired JdbcTemplate jdbctemplate = null; // @Inject @MockBean // @Autowired RequestUtil requestUtil; @Before public void setUp() throws Exception { mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build(); } @Test public void testComment() throws Exception { // parmがない String responseString = mockMvc .perform(MockMvcRequestBuilders.post("/openSesame").contentType(MediaType.APPLICATION_JSON_VALUE)) .andExpect(status().isOk()).andReturn().getResponse().getContentAsString(); System.out.println("哈哈哈" + responseString); } @Test public void testComment1() throws Exception { // parmがある String responseString = mockMvc .perform(MockMvcRequestBuilders.post("/openSesame/getTableInfos") .contentType(MediaType.APPLICATION_JSON_VALUE).param("weid", "11").param("bussinessid", "1") .param("storeid", "53").param("date", "20190901")) .andExpect(status().isOk()).andReturn().getResponse().getContentAsString(); System.out.println("哈哈哈" + responseString); } @Test public void testComment2() throws Exception { // DB検索 List<Map<String, Object>> aa = jdbctemplate.queryForList("select * from ims_wcy_mst_code"); ImsWcyMakeAnAppointment imsWcyMakeAnAppointment = new ImsWcyMakeAnAppointment(); imsWcyMakeAnAppointment.setWeid(11); imsWcyMakeAnAppointment.setBussinessid(1); imsWcyMakeAnAppointment.setStoreid(53); when(requestUtil.doPost(11, 1, 53, "/reserveCheck", null)).thenReturn("2");
// Controller侧的RequestBody是javabean的场合
// public String submit(@RequestBody ImsWcyMakeAnAppointment make,HttpServletRequest request){
String jsonObject = JSONObject.fromObject(imsWcyMakeAnAppointment).toString();
// Controller侧的RequestBody是Object[]的场合
// public String XXXXXX(HttpServletRequest request,@RequestBody Object[] dto) throws IOException{
Object[] dto = new String[] { "1", "1", "1" };
String a = JSONArray.fromObject(dto).toString();
// parmがJSON
String responseString = mockMvc.perform(MockMvcRequestBuilders.post("/openSesame/submit") .contentType(MediaType.APPLICATION_JSON_VALUE).content(jsonObject)).andExpect(status().isOk()) .andReturn().getResponse().getContentAsString(); // result検証 Assert.assertEquals(1, 1); System.out.println("哈哈哈" + responseString); } }
运行即可
注※1 mock不好用的场合要确认被测试的类是否是@Service
场合2:当你的Controller里面有用到下面的代码
@RequestMapping(value = "/XXX", method = RequestMethod.POST) // @RequestMapping("/mobilescreen/getfoodInfo") public String XXX(String itemCode, String syokujiCode, HttpServletRequest request) { Map<String, Object> map = new HashMap<String, Object>(); JSONArray json = new JSONArray(); JsonConfig jsonConfig = new JsonConfig(); jsonConfig.registerJsonValueProcessor(Date.class, new JsonDateValueProcessor()); HttpSession session = request.getSession(); Login userInfo = (Login) session.getAttribute("LOGIN_USER"); }
测试类要修正
package com.cnc.mht.web.rest; import static org.mockito.Mockito.*; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.http.MediaType; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.mock.web.MockHttpServletResponse; import org.springframework.mock.web.MockHttpSession; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.ResultActions; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext; import com.cnc.mht.util.login.LoginUserInfoReform; @SpringBootTest @RunWith(SpringJUnit4ClassRunner.class) public class XXX_test { @Autowired private WebApplicationContext webApplicationContext; private MockMvc mockMvc; @Autowired JdbcTemplate jdbctemplate = null; private MockHttpServletRequest request; @Autowired MockHttpSession session; @Before public void setUp() throws Exception { mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build(); } @Test public void testComment1() throws Exception { Login aa = new Login(); aa.setBussinessid(1); session.setAttribute("LOGIN_USER", aa); // parmがある ResultActions responseString = mockMvc .perform(MockMvcRequestBuilders.post("/mobilescreen/getfoodInfo") .contentType(MediaType.APPLICATION_JSON_VALUE).session(session).param("itemCode", "11") .param("syokujiCode", "1")); System.out.print("aaa"); } }
运行即可