2016-06-23 6 views
4

RestController에 대한 간단한 테스트가 있는데, $[1].parent_id은 Integer 프리미티브가 아닌 객체로 Long을 반환 할 것으로 기대합니다. . 다른 테스트에서강제로`.andExpect (jsonPath()`가 long/long을 int 대신에 int 대신 사용하도록하는 방법)

@RunWith(SpringJUnit4ClassRunner.class) 
@SpringApplicationConfiguration(classes = Application.class) 
@WebAppConfiguration 
@WebAppConfiguration 
public class TransactionServiceControllerTest { 

@Before 
public void setup() throws Exception { 
    this.mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build(); 
    // I copy this from my RestController class 
    this.transactions = Arrays.asList(
      new Transaction(100d, "car", null), 
      new Transaction(100d, "table", 12L) 
    ); 
} 

@Test 
public void readSingleBookmark() throws Exception { 
    mockMvc.perform(MockMvcRequestBuilders.get("/transaction/")) 
    .andExpect(content().contentType(contentType)) // ok 
    .andExpect(jsonPath("$", hasSize(2))) // ok 
    //omitted 
    andExpect(jsonPath("$[1].parent_id",is(this.transactions.get(1).getParentId()))); 
} //assertion fail 

Expected: is <12L> 
but: was <12> 

결과 :

Expected: is <12L> 
but: was <2147483650L> //return Long instead int 

이 내 JacksonConfiguration

,536,913입니다 : parent_id 긴 번호 범위에 있으며> 정수 범위 (2147483650L 등)의 경우는 긴 반환합니다 63,210
@Configuration 
public class JacksonConfiguration { 

    @Bean 
    @Primary 
    public ObjectMapper objectMapper() { 
     final ObjectMapper objectMapper = new ObjectMapper(); 

     //supposed to be this is the magic trick but it seems not.. 
     objectMapper.enable(DeserializationFeature.USE_LONG_FOR_INTS); 


     objectMapper.setSerializationInclusion(JsonInclude.Include.NON_ABSENT); 
     objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE); 
     return objectMapper; 
    } 
} 

그리고 내 POJO

public class Transaction { 

private double ammount; 

private String type; 

private Long parentId; 

public Transaction(Double ammount, String type, Long parentId) { 
    //omitted 
} 
//setter and getter omitted 
} 

MyRestController

@RestController 
@RequestMapping("transaction") 
public class TransactionServiceController { 

@RequestMapping(method = RequestMethod.GET) 
List<Transaction> getTransaction() { 
    return 
      Arrays.asList(
        new Transaction(100d, "car", null), 
        new Transaction(100d, "table", 12L) 
      ); 
    } 
} 

그리고 Application.java

@SpringBootApplication 
public class Application { 
    public static void main(String[] args){ 
     SpringApplication.run(Application.class,args); 
    } 
} 
+0

질문에 대한 대답 중 하나가 받아 들여지면 원한다면 [accept it] (http://stackoverflow.com/help/accepted-answer)을 참조하십시오. –

+0

오늘 (1 년 후) 나는 단지 내가 틀린 버튼을 눌렀다는 것을 깨닫는다. 나는 대답을 수락하는 것이'''위로 버튼''이라고 생각했다. 그러나 이것은''''Stackoverflow new user welcome how to''에서 철저히 설명 된''check button''입니다. 많은 사람들은 샘 브레너 (SamBrenner)에게 우호적 인 (거의 무시한) 신호에 감사드립니다. – slawalata

+0

걱정할 필요가 없습니다. 건배! ;-) –

답변

4

업데이트 (2016 8 월)

스프링 프레임 워크 5.0은 명시 적 변환을위한 일류 지원을 추가합니다. 자세한 내용은 SPR-14498을 참조하십시오. (개인적으로 확인되지 I 피난처)


하나의 옵션은 다른 JsonProvider을 시도하는 것입니다. 이는 com.jayway.jsonpath.Configuration.setDefaults(Defaults)을 통해 설정할 수 있습니다.

andExpect(jsonPath("$[1].parent_id",is(this.transactions.get(1).getParentId().intValue()))); 

그리고 유일한 다른 옵션을 수신 Integer로 변환하는 사용자 정의 Matcher을 작성하는 것입니다 : 당신이 Long 항상 안전하게 int로 축소 할 수 있는지 확인하는 경우

, 당신은 다음을 사용할 수 있습니다 실제 일치를 수행하기 전에 Long.