11

Spring 3.2 の新しい MVC Testframework の使用を開始し、すべてのテスト ケースで 406 HTTP 応答コードを取得することに行き詰まりました。

テストケースはシンプルです

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: Status expected:<200> but was:<406> at org.springframework.test.util.AssertionErrors.fail(AssertionErrors.java:60) at org.springframework.test.util.AssertionErrors.assertEquals( AssertionErrors.java:89) org.springframework.test.web.servlet.result.StatusResultMatchers$5.match(StatusResultMatchers.java:546) org.springframework.test.web.servlet.MockMvc$1.andExpect(MockMvc.java: 141) de.yourdelivery.rest.location.LocationResouceTest.testGetLocationByPlzPattern(LocationResouceTest.java:37) で sun.reflect.NativeMethodAccessorImpl.invoke0(ネイティブメソッド) で sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) でjava.lang.reflect.Method.invoke(Method.java:597) org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45) で org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) で org.junit. org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) の runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42) org.junit.internal.runners.statements.RunBefores.evaluate( RunBefores.java:28) at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74) at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java: 83) org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72) で org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:88) at org.junit.runners.ParentRunner$3.run (ParentRunner.java:231) org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60) org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229) org.junit.runners.ParentRunner .access$000(ParentRunner.java:50) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222) at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) ) org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71) で org.junit.org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run( org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java: 467) org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) で org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) で org .eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)run(SpringJUnit4ClassRunner.java:174) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution. java:38) org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) で org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) でorg.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) で org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) でrun(SpringJUnit4ClassRunner.java:174) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution. java:38) org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) で org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) でorg.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) で org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) でinternal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) at org.eclipse.jdt.internal.junit. org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) の runner.RemoteTestRunner.run(RemoteTestRunner.java:390)internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) at org.eclipse.jdt.internal.junit. org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) の runner.RemoteTestRunner.run(RemoteTestRunner.java:390)

4

8 に答える 8

18

クラスがある場合は、 .xml で XML 構成を使用する代わりに@Configuration、注釈を追加でき ます。@EnableWebMvc<mvc:annotation-driven />

于 2013-11-18T19:00:12.180 に答える
3

これは、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>

上記が問題であるかどうかを簡単にテストできます。コントローラーは特別なもの ( no producesinなど@RequestMapping) を指定していないため、コンテンツ ネゴシエーションは必要ありません。

@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"); 
}
于 2013-01-23T18:41:39.010 に答える
3

@EnableWebMvc との両方が必要です。.accept(MediaType.APPLICATION_JSON)

于 2016-09-01T20:32:30.903 に答える
3

jackson で POJO をシリアライズするには、次のコードを spring xml に追加する必要があります。

<annotation-driven />
于 2013-03-13T10:46:01.090 に答える
2

<mvc:annotation-driven />構成 xml ファイルにがありません。

于 2013-07-17T06:36:59.203 に答える
0

修正は、リクエストを次のように変更することだと思います。

this.mockMvc.perform(get("/someurl?someparam=somevalue").contentType(MediaType.APPLICATION_JSON)).andExpect..
于 2013-01-02T15:52:46.323 に答える
0

春のやり方は、HttpResponseEntityを使用するか、モデルとビューを返すことだと思います。例えば ​​:

@ResponseBody
ResponseEntity<String> getFoo() {
  HttpHeaders responseHeaders = new HttpHeaders();
  responseHeaders.setContentType(MediaType.APPLICATION_JSON);
  String test = "{\"foo\":{\"title\": \"Stack\"}}";
  return new ResponseEntity<String>(test, responseHeaders, HttpStatus.OK);
}

(すべてがかなり新しいので、あなたのさらなる進歩に興味があります)

于 2013-01-02T14:56:12.340 に答える
-1

私は今同じ問題に遭遇し、コントローラーの戻り値の型を文字列に変更することで解決しました。オブジェクトを直接返すのではなく、JSON 文字列を返します。それは機能します。

Gson gson = new Gson();
return gson.toJson(dto);
于 2013-04-11T06:35:13.377 に答える