0

Spring MVC テスト フレームワークの standaloneSetup モードを使用して非同期メソッド呼び出しをテストすると、一貫性のない結果が得られます。次のテストは、私の IDE では合格できますが、ANT を使用して実行すると失敗しますが、ANT を使用して実行すると合格するか、IDE で失敗することがあります。2 番目の呼び出しの内容は、空の文字列を返すか、期待される応答を返します。

最初の呼び出しに .andDo(print) を追加するか、2 つの mockMvc.perform 呼び出しの間にたとえば 500 ミリ秒の Sleep を追加すると、テストに合格します。

他の誰かがこれに遭遇しましたか?

コントローラールート

@RequestMapping(method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
public final Callable<ResponseEntity<List<Integer>>> getEntries(
        @RequestParam(value = "limit", defaultValue = "100") final int limit) {
    return new Callable<ResponseEntity<List<Integer>>>() {
        @Override
        public ResponseEntitcany<List<Integer>> call() {
            return new ResponseEntity<List<Integer>>(service.findTopEntries(limit), HttpStatus.OK);
        }
    };
}

テスト

this.mockMvc = MockMvcBuilders.standaloneSetup(controller).build();

@Test
public void testJSONResponse() throws Exception {

    MvcResult mvcResult = this.mockMvc.perform(get(this.basePath)
            .accept(MediaType.APPLICATION_JSON))
            .andReturn();

    this.mockMvc.perform(asyncDispatch(mvcResult))
            .andExpect(status().isOk())
            .andExpect(content().string("[]"));
}
4

3 に答える 3

3

asyncStarted を呼び出す必要があります

MvcResult mvcResult = this.mockMvc.perform(get(this.basePath)
        .accept(MediaType.APPLICATION_JSON)).andExpect(request().asyncStarted())
        .andReturn();

これでも時々一貫性のない結果が得られましたが

于 2013-11-01T00:31:29.430 に答える
2

ダミーを呼び出すのに役立ちました

mvcResult.getAsyncResult();

結果を確認する前に。そうしないと、404 ではなく 200 の応答が返されます。Spring 4.0.6。

        final MvcResult mvcResult = this.mockMvc.perform(get("/api/buildings/{id}", key.toString())
            .accept(MediaType.APPLICATION_JSON))
            .andExpect(request().asyncStarted())
            .andReturn();
        mvcResult.getAsyncResult();

        this.mockMvc.perform(asyncDispatch(mvcResult))
            .andDo(print())
            .andExpect(status().isNotFound());
于 2014-08-20T11:40:19.333 に答える