9

コントローラーで単体テストを実行しようとしています。私が何をしても、すべてのコントローラーテストが返されます

java.lang.AssertionError: Content type not set

メソッドがjsonおよびxmlデータを返すことをテストしています。

コントローラーの例を次に示します。

@Controller
@RequestMapping("/mypath")

public class MyController {

   @Autowired
   MyService myService;

   @RequestMapping(value="/schema", method = RequestMethod.GET)
   public ResponseEntity<MyObject> getSchema(HttpServletRequest request) {

       return new ResponseEntity<MyObject>(new MyObject(), HttpStatus.OK);

   }

}

単体テストは次のように設定されます。

public class ControllerTest() { 

private static final String path = "/mypath/schema";
private static final String jsonPath = "$.myObject.val";
private static final String defaultVal = "HELLO";

MockMvc mockMvc;

@InjectMocks
MyController controller;

@Mock
MyService myService;

@Before
public void setup() {
    MockitoAnnotations.initMocks(this);

    mockMvc = standaloneSetup(controller)
                .setMessageConverters(new MappingJackson2HttpMessageConverter(),
                        new Jaxb2RootElementHttpMessageConverter()).build();


    when(myService.getInfo(any(String.class))).thenReturn(information);
    when(myService.getInfo(any(String.class), any(Date.class))).thenReturn(informationOld);

}

@Test
public void pathReturnsJsonData() throws Exception {

    mockMvc.perform(get(path).contentType(MediaType.APPLICATION_JSON))
        .andDo(print())
        .andExpect(content().contentTypeCompatibleWith(MediaType.APPLICATION_JSON))
        .andExpect(jsonPath(jsonPath).value(defaultVal));
}

}

私が使用しています:Spring 4.0.2 Junit 4.11 Gradle 1.12

SOの質問Similiar Questionを見たことがありますが、ユニットテストでcontentTypeとexpectのどのような組み合わせであっても、同じ結果が得られます。

どんな助けでも大歓迎です。

ありがとう

4

2 に答える 2

10

ソリューションは、プロジェクトで使用する注釈の種類によって異なります。

  • @ResponseBodyController の getSchema メソッドに追加できます

  • または、produces属性を追加する@RequestMappingことで解決できるかもしれません。

    @RequestMapping(value="/schema", 
          method = RequestMethod.GET, 
          produces = {MediaType.APPLICATION_JSON_VALUE} )
    
  • 最終的な選択として、ヘッダーを追加しますResponseEntity(これは、このクラスを使用する主な目的の 1 つです)。

    //...
    HttpHeaders headers = new HttpHeaders();
    headers.add("Content-Type", "application/json; charset=utf-8");
    return new ResponseEntity<MyObject>(new MyObject(), headers, HttpStatus.OK);
    

編集:Json AND Xml Dataが必要なのを見たので、より良い選択はproduces属性です:

@RequestMapping(value="/schema", 
      method = RequestMethod.GET, 
      produces = {MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE} )
于 2014-06-11T21:50:19.900 に答える