SSM中利用MockMvc测试controller出现的几个问题

SSM中利用MockMvc测试controller出现的几个问题

  1. Error creating bean with name ‘locationServiceImpl’
    具体见以下log
十月 21, 2018 10:58:26 上午 org.springframework.web.context.support.GenericWebApplicationContext refresh
警告: Exception encountered during context initialization - cancelling refresh attempt
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'locationServiceImpl': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private ssm.zsc.first.dao.LocationMapper ssm.zsc.first.service.impl.LocationServiceImpl.locationMapper; nested exception is org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class [org.springframe.web.servlet.view.InternalResourceViewResolver] for bean with name 'org.springframe.web.servlet.view.InternalResourceViewResolver#0' defined in class path resource [spring-web.xml]; nested exception is java.lang.ClassNotFoundException: org.springframe.web.servlet.view.InternalResourceViewResolver
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1210)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537)
	at 

这里仅截取了一部分。

controller部分代码:

import java.util.HashMap;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import ssm.zsc.first.pojo.LocationParam;
import ssm.zsc.first.service.LocationService;

@Controller
@RequestMapping("/location")
public class LocationController {
	
	private Logger logger = LoggerFactory.getLogger(this.getClass());
	@Autowired
	private LocationService locationService;
	@RequestMapping(value = "one.json",method = RequestMethod.POST)
	@ResponseBody    //将返回的map格式转换为json格式
	public Map<String,Integer> addLocationToMysql(@RequestBody LocationParam locationParam){
		System.out.println("into-------------------controller----method");
		Map<String,Integer> map = new HashMap<String, Integer>();
		int result = locationService.insertOrUp(locationParam);
		map.put("result", result);
		return map;
	}
}

spring-web.xml部分:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:context="http://www.springframework.org/schema/context"
  xmlns:mvc="http://www.springframework.org/schema/mvc"
  xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd
    http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
    <!-- 配置springmvc -->
    <!-- 1.开启springmvc注解模式 -->
    <mvc:annotation-driven/>
    <!-- 2.静态资源默认servlet配置 -->
    <mvc:default-servlet-handler/>
    <!-- 3.配置jsp显示viewResolver -->
    <bean class="org.springframe.web.servlet.view.InternalResourceViewResolver">
      <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
      <property name="prefix" value="/WEB-INF/jsp/"/>
      <property name="suffix" value=".jsp"></property>
    </bean>
    
    <!-- 4.扫描web相关的bean -->
    <context:component-scan base-package="ssm.zsc.first.controller"/>
    
</beans>

简要来说,controller内的方法需要接收以及返回的数据均为json格式,并没有返回ModelAndView,因此不需要InternalResourceViewResolver。把那一块的bean注释掉,问题消除。(个人理解)

  1. 一个低级错误
    MockMvc测试部分代码:
import javax.servlet.ServletContext;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
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.result.MockMvcResultMatchers;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.context.WebApplicationContext;

import com.fasterxml.jackson.databind.ObjectMapper;

import ssm.zsc.first.controller.LocationController;
import ssm.zsc.first.pojo.LocationParam;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:spring-mybatis.xml","classpath:spring-service.xml","classpath:spring-web.xml"})
@Transactional
@WebAppConfiguration
public class ControllerTest {
	@Autowired
	private LocationController locationController;
	
	//@Autowired
	//private ServletContext context;
	
	@Autowired
	private WebApplicationContext context;
	private MockMvc mockMvc;
	
	@Before
	public void setUp(){
		//mockMvc = MockMvcBuilders.standaloneSetup(locationController).build();
		mockMvc = MockMvcBuilders.webAppContextSetup(this.context).build();
		System.out.println("mockMvc-Initial");
	}
	
	@Test
	@Rollback(false)
	public void ConTest() throws Exception{
		//String requestBody = "{\"phoneNumber\":5431,\"longitude\":99.99,\"latitude\":11.11,\"status\":1}";
		ObjectMapper mapper = new ObjectMapper();
		LocationParam locationParam = new LocationParam();
		locationParam.setPhoneNumber(9999);
		locationParam.setLongitude(99.99);
		locationParam.setLatitude(11.11);
		locationParam.setStatus(1);
		String json = mapper.writeValueAsString(locationParam);
		System.out.println("before--------------------post");
		System.out.println(json.toString());
		ResultActions action = mockMvc.perform(MockMvcRequestBuilders.post("http://127.0.0.1:8080/location/one.json").contentType("application/json;charset=UTF-8").content(json).accept(MediaType.APPLICATION_JSON));
		action.andExpect(MockMvcResultMatchers.content().contentType("application/json;charset=UTF-8")).andExpect(MockMvcResultMatchers.status().isOk());
		System.out.println("after---------------------post");
	}

}

在最开始的时候,MockMvcRequestBuilders.post()内写的网址为"localhost:8080/location/one.json",导致一直没有数据库写入成功
后改为"http://127.0.0.1:8080/location/one.json",成功。
成功后出现的log:

mockMvc-Initial
before--------------------post
{"phoneNumber":9999,"longitude":99.99,"latitude":11.11,"status":1}
into-------------------controller----method
11:12:51.002 [main] DEBUG org.mybatis.spring.SqlSessionUtils - Creating a new SqlSession
11:12:51.008 [main] DEBUG org.mybatis.spring.SqlSessionUtils - Registering transaction synchronization for SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@600b0b7]
11:12:51.014 [main] DEBUG o.m.s.t.SpringManagedTransaction - JDBC Connection [com.mchange.v2.c3p0.impl.NewProxyConnection@38875e7d] will be managed by Spring
11:12:51.019 [main] DEBUG s.z.f.d.LocationMapper.replaceByNum - ==>  Preparing: INSERT INTO how_ (phone_number,longitude,latitude,status) VALUES (?,?,?,?) ON DUPLICATE KEY UPDATE latitude=?,longitude=?,status=?; 
11:12:51.053 [main] DEBUG s.z.f.d.LocationMapper.replaceByNum - ==> Parameters: 9999(Long), 99.99(Double), 11.11(Double), 1(Integer), 11.11(Double), 99.99(Double), 1(Integer)
11:12:51.056 [main] DEBUG s.z.f.d.LocationMapper.replaceByNum - <==    Updates: 1
11:12:51.063 [main] DEBUG org.mybatis.spring.SqlSessionUtils - Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@600b0b7]
after---------------------post
11:12:51.081 [main] DEBUG org.mybatis.spring.SqlSessionUtils - Transaction synchronization committing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@600b0b7]
11:12:51.081 [main] DEBUG org.mybatis.spring.SqlSessionUtils - Transaction synchronization deregistering SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@600b0b7]
11:12:51.081 [main] DEBUG org.mybatis.spring.SqlSessionUtils - Transaction synchronization closing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@600b0b7]

这里仅截取了部分。
个人小白,欢迎交流。

猜你喜欢

转载自blog.csdn.net/frank_stone/article/details/83240050