SpringMVC 4.3 nacos1.4 mock2.0 junit4.13 测试Controller

使用@WebAppConfiguration @ContextConfiguration 注解的方式报错:

nacos 和spring 注解加载前后有问题,换了思路解决问题

Caused by: java.lang.IllegalStateException: org.springframework.context.support.GenericApplicationContext@40ef3420 has not been refreshed yet
	at org.springframework.context.support.AbstractApplicationContext.assertBeanFactoryActive(AbstractApplicationContext.java:1069)
	at org.springframework.context.support.AbstractApplicationContext.getBeanNamesForType(AbstractApplicationContext.java:1183)
	at com.alibaba.spring.util.BeanUtils.getBeanNames(BeanUtils.java:153)
	at com.alibaba.spring.util.BeanUtils.getBeanNames(BeanUtils.java:136)
	at com.alibaba.nacos.spring.util.NacosBeanUtils.isBeanDefinitionPresent(NacosBeanUtils.java:207)
	at com.alibaba.nacos.spring.util.NacosBeanUtils.registerInfrastructureBeanIfAbsent(NacosBeanUtils.java:174)
	at com.alibaba.nacos.spring.util.NacosBeanUtils.registerNacosApplicationContextHolder(NacosBeanUtils.java:285)
	at com.alibaba.nacos.spring.util.NacosBeanUtils.registerNacosCommonBeans(NacosBeanUtils.java:372)
	at com.alibaba.nacos.spring.context.annotation.NacosBeanDefinitionRegistrar.registerNacosAnnotationBeans(NacosBeanDefinitionRegistrar.java:83)
	at com.alibaba.nacos.spring.context.config.xml.NacosAnnotationDrivenBeanDefinitionParser.parse(NacosAnnotationDrivenBeanDefinitionParser.java:49)
	at org.springframework.beans.factory.xml.NamespaceHandlerSupport.parse(NamespaceHandlerSupport.java:74)
	at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1435)
	at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1419)
	at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:172)
	at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.doRegisterBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:142)
	at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:94)
	at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(XmlBeanDefinitionReader.java:508)
	at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:392)

解决思路:使用XmlWebApplicationContext 创建Spring的rootWebApplicationContext

再使用XmlWebApplicationContext创建Spring的webApplicationContext,两者绑定下,在给到

MockMvcBuilders,测试就完成了MockMvc初始化,就可以使用mockMvc.perform(requestBuilder)请求你的Controller的地址了

private MockMvc mockMvc;
	XmlWebApplicationContext webApplicationContext;
    @Before
    public void setup() {
    	
      // 创建web应用程序根上下文,该上下文解析并管理系统实例  
      XmlWebApplicationContext rootWebApplicationContext = new XmlWebApplicationContext();  
      rootWebApplicationContext.setConfigLocations("classpath:spring-context.xml");  
      rootWebApplicationContext.refresh(); 
      // 创建servletContext上下文  
      // 创建web应用程序上下文,管理controller层请求业务  
      webApplicationContext = new XmlWebApplicationContext();  
      webApplicationContext.setConfigLocations("classpath:spring-mvc.xml","classpath:spring-mvc-rest.xml","classpath:spring-mvc-modeler.xml");  
      webApplicationContext.setParent(rootWebApplicationContext);  
      //servletContext.get
      MockServletContext servletContext = new MockServletContext();  
      webApplicationContext.setServletContext(servletContext);  
      webApplicationContext.refresh();  
      Map<String, Object> mm =  webApplicationContext.getBeansWithAnnotation(Controller.class);
      servletContext.getServletContextName();
      servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, webApplicationContext);  
      mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
      
    }
	
	@Test
	public void testGet() {
		MockHttpServletRequestBuilder requestBuilder =
				MockMvcRequestBuilders.post("/longtp/offlinebak/get")
                .param("id", "1");
		
		try {
            MockHttpServletRequest request = mockMvc.perform(requestBuilder)
            .andDo(MockMvcResultHandlers.print()) // 打印请求、响应及其他相关信息
            .andExpect(MockMvcResultMatchers.status().isOk()) // 期待返回的状态是OK【200】
            //.andExpect(MockMvcResultMatchers.content().string("id")) // 期待返回的内容是“hello”
           // .andExpect(MockMvcResultMatchers.content().contentType(MediaType.APPLICATION_JSON_VALUE)) // 预期返回的媒体类型是JSON
            //.andExpect(MockMvcResultMatchers.forwardedUrl("/WEB-INF/views/result.jsp")) // 预期请求到此页面
            .andReturn()
            .getRequest();
            // 拿到了请求对象。。。
        } catch (Exception e) {
            e.printStackTrace();
        }

	}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值