2016-06-09 3 views
0

JsonDeserializer에서 스프링 유선 서비스가 필요한 애플리케이션이 있습니다. 문제는 응용 프로그램을 정상적으로 시작할 때 유선 상태이지만 테스트에서 시작할 때 null입니다.스프링 부트 통합 테스트에서 JsonDeserializer의 자동 연결

관련 코드는 다음과 같습니다

JSON 시리얼 라이저/디시리얼라이저 :

@Component 
public class CountryJsonSupport { 

    @Component 
    public static class Deserializer extends JsonDeserializer<Country> { 

     @Autowired 
     private CountryService service; 

     @Override 
     public Country deserialize(JsonParser jsonParser, DeserializationContext ctx) throws IOException { 
      return service.getById(jsonParser.getValueAsLong()); 
     } 
    } 
} 

도메인 개체 :

public class BookingLine extends AbstractEntity implements TelEntity { 

    .....other fields 

    //Hibernate annotations here.... 
    @JsonDeserialize(using = CountryJsonSupport.Deserializer.class) 
    private Country targetingCountry; 

    ..... other fields 
} 

테스트 클래스 :

@RunWith(SpringJUnit4ClassRunner.class) 
@SpringApplicationConfiguration(Application.class) 
@WebIntegrationTest({"server.port=0"}) 
@ActiveProfiles("test") 
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) 
public class BookingAndLinesControllerFunctionalTest { 

    @Test 
    public void testGetBooking() { 
     Booking booking = bookingRepositoryHelper.createBooking(); 
     bookingRepository.save(booking); 
     String uri = String.format("http://localhost:%s/api/v1/booking-and-lines/" + booking.getBookingCode(), port); 
     Booking booking1 = restTemplate.getForObject(uri, Booking.class); // line which falls over because countryService is null 
    } 
} 

어떤 아이디어?

답변

0

충분히 오랫동안 주위를 내다 본 후에이 답변을 발견 할 수 있도록 관리했습니다. 다음과 같이 설정하면됩니다.

@Configuration 
@Profile("test") 
public class TestConfig { 

    @Bean 
    public HandlerInstantiator handlerInstantiator() { 
     return new SpringHandlerInstantiator(applicationContext.getAutowireCapableBeanFactory()); 
    } 

    @Bean 
    public Jackson2ObjectMapperBuilder jackson2ObjectMapperBuilder(HandlerInstantiator handlerInstantiator) { 
     Jackson2ObjectMapperBuilder result = new Jackson2ObjectMapperBuilder(); 
     result.handlerInstantiator(handlerInstantiator); 
     return result; 
    } 

    @Bean 
    public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter(Jackson2ObjectMapperBuilder objectMapperBuilder) { 
     return new MappingJackson2HttpMessageConverter(objectMapperBuilder.build()); 
    } 

    @Bean 
    public RestTemplate restTemplate(MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter) { 
     List<HttpMessageConverter<?>> messageConverterList = new ArrayList<>(); 
     messageConverterList.add(mappingJackson2HttpMessageConverter); 
     return new RestTemplate(messageConverterList); 
    } 
} 
관련 문제