当前位置: 首页 > 知识库问答 >
问题:

spring MVC testframework失败,HTTP响应406

向俊贤
2023-03-14

我开始使用spring 3.2的新MVC Testframework,但却无法为所有测试用例获取406个HTTP响应代码。

testcase非常简单

public class LocationResouceTest {

    @Autowired
    private WebApplicationContext wac;

    private MockMvc mockMvc;

    @Before
    public void setup() {
        this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();
    }

    @Test
    public void testGetLocationByPlzPattern() throws Exception {
        // here I need to define the media type as a static var from MediaType
        this.mockMvc.perform(get("/someurl?someparam=somevalue")).andExpect(status().isOk());
    }

}

相应的资源是

@Controller
// here I need to define the media type as string
@RequestMapping(value = "/someurl", produces = "application/json; charset=UTF-8")
public class LocationResource {

    @ResponseBody
    @RequestMapping(method = RequestMethod.GET)
    public ArrayList<DTO> getAllIndex(@RequestParam("someparam") String param) {
        return ... //the list of DTO classes is transformed to json just fine if called with curl
    }

}

我确信这是因为一个错误的媒体类型,但我不知道为什么。

失败测试用例的跟踪:

java.lang.AssertionError:状态应为:<200>但为:<406>在org.springframework.test.util.AssertionErrors.fail(AssertionErrors.AsserteQuals(AssertionErrors.java:60)在org.springframework.test.web.servlet.result.StatusResultMatchers$5。Match(StatusResultMatchers.546)在org.springframework.test.web.servlet.mockMVC$1。在ers.model.frameworkmethod.invokeExplory(Frameworkmethod.Java:42)位于org.junit.internal.runners.statements.invokeMethod.evalue(invokeMethod.Java:20)位于org.junit.internal.runners.statements.runbeFores.evalue(RunbeFores.Java:28)位于org.springframework.test.context.junit4.statements.runbeFores.evalue(RunbeFores.Java:28)位于AVA:229)在org.junit.runners.parentrunner.access$000(parentrunner.Java:50)在org.junit.runners.parentrunner.$2。evaluate(parentrunner.Java:222)在org.springframework.test.context.junit4.statements.runbeforestclasscallbacks.evaluate(runbeforestclasscallbacks.Java:61)在trunner.java:390)位于org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

共有2个答案

冯通
2023-03-14

这可能是由于在spring测试上下文中没有任何MVC配置造成的。当使用类似:

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration("/test-context.xml")

...那么test-context.xml文件还应包括以下内容:

<mvc:annotation-driven content-negotiation-manager="contentNegotiationManager">
  <mvc:message-converters>
    <bean id="..." class=
"org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
    <bean id="..."
      class="org.springframework.http.converter.StringHttpMessageConverter"/>
    <bean id="..."
      class="org.springframework.http.converter.FormHttpMessageConverter"/>
  </mvc:message-converters>
</mvc:annotation-driven>

<bean id="contentNegotiationManager" 
  class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
  <property name="defaultContentType" value="application/json" />
  <property name="mediaTypes">
    <value>
      json=application/json
      xml=application/xml
    </value>
  </property>
</bean>

如果一个控制器不指定任何特殊内容(例如:@requestmappingnoproduct),因此不需要任何内容协商,那么就可以轻松地测试上述问题是否是问题所在:

@RequestMapping(value = "/foo", method = RequestMethod.GET)
@ResponseBody
public String getFoo() {
    return "bar";
}

...与:

@Test
public void getFoo() throws Exception {
    MvcResult result = 
      this.mockMvc.perform(get("/foo").accept(MediaType.TEXT_PLAIN))
        .andExpect(status().isOk())
        .andReturn();
    Assert.assertEquals(result.getResponse().getContentAsString(), "bar"); 
}
王伯寅
2023-03-14

如果您有@configuration类,则可以添加@enablewebmvc批注,而不是使用带有 的XML配置。

 类似资料:
  • 我在Alamofire 5.3中收到了大量失败的请求,其中响应对象本身为nil,或者错误为“无法解析响应”。我可以从服务器日志中看到,所有这些请求都返回有效。 这是我的设置: API管理器类: AccessTokenInterceptor: 这个拦截器从插入我的授权令牌 我也使用标准路由器的URL刚需转换,编码是通过JSON序列化(字典)或可编码协议(对象) 奇怪的是,我不认为我在做任何不同于我使

  • 主要内容:HTTP响应完整格式HTTP响应完整格式 HTTP的响应也由三部分组成(响应行+响应头+响应体): 以下是一个实际的HTTP响应示例: ①报文协议及版本; ②状态码及状态描述; ③响应报文头,也是由多个属性组成; ④响应报文体,即我们真正要的“干货”。

  • 基本响应 当然,所有的路由及控制器必须返回某个类型的响应,并发送回用户的浏览器。Laravel 提供了几种不同的方法来返回响应。最基本的响应就是从路由或控制器简单的返回一个字符串: $router->get('/', function () { return 'Hello World'; }); 指定的字符串会被框架自动转换成 HTTP 响应。 响应对象 但是,对于大多数路由和控制器行为

  • Blade 中操作响应的对象是 Response 发送文本 Response#text 用于发送一个状态码为 200 的文本响应 public void responseText(Response response){ response.text("Hello World"); } 发送HTML Response#html 用于发送一个状态码为 200 的HTML响应 public voi

  • 我在解密收到的验证响应SAML消息时遇到问题。我的应用程序连接了两个不同类型的国内流离失所者。第一是ForgeRocks,OpenAM,第二是微软的ADFS服务器。为两个IDP提供了相同的服务提供商元数据文档,该文档包含用于加密和签名的相同证书公钥。 案例01 IdP : OpenAM,ForgeRock结果:正确处理解密和响应。 案例02 IdP:ADFS 2.0,Microsoft结果:解密失

  • 我正在部署一个web应用程序,它在Azure应用程序服务上使用NodeJS、Express和React(插入我的BitBucket repo),但我没有发现成功。要么部署失败,要么声称部署成功,但该站点无法访问,并且一直超时。当我在Azure诊断中检查Docker日志时,我注意到以下几点: 在几个读取