2016-08-03 7 views
0

Я пишу тестовые примеры интеграции с использованием MockMvc для тестирования моего REST API.mock non spring управляемый объект во время тестирования интеграции с использованием mockMVC

В рамках моей реализации RESTAPI я внутренне использую RestTemplate (не непосредственно из контроллера, а из класса util, который вызывает контроллер), чтобы вызвать сторонний REST API. The RestTemplate, который я использую (для создания стороннего API-интерфейса), не является управляемым bean-компонентом, вместо этого я создаю его как RestTemplate restTemplate = new RestTemplate();

Я хочу высмеять вызов restTemplate (postForEntity).

Я пытаюсь ниже подход:

Мой тест class-

@ContextConfiguration(locations = { 
    "classpath:test-applicationContext.xml" 
}) 
@WebAppConfiguration 

общественного класса MockMVCTest {

private MockMvc mockMvc; 
    private RestTemplate restTemplate 

    @Autowired 
    private WebApplicationContext webApplicationContext; 

    @Before 
    public void setUp() { 
    if (!initalized) { 
    mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build(); 
    restTemplate = (RestTemplate)webApplicationContext.getBean("restTemplate"); 

}

@Test 
public void demo() throws Exception { 
when(
    restTemplate.postForEntity(
    eq("thirdpartyuri"), 
    any(HttpEntity.class), 
    eq(MyClass.class))).thenReturn(myresponse); 

mockMvc.perform(
    post("uriExposedbyme") 
    .contentType(MediaType.APPLICATION_JSON) 
    .accept(MediaType.APPLICATION_JSON) 
    .content(MY_PAYLOAD)).andExpect(status().isOk()); 
} 

В моем прикладном контексте У меня есть fo llowing макет определяется:

<bean id="restTemplate" class="org.mockito.Mockito" factory-method="mock"> 
    <constructor-arg value="org.springframework.web.client.RestTemplate" />  </bean> 

Но когда я исполню мой тестовый СЛУЧАЙ RestTemplate становится издевались, но когда вызов RestTemplate происходит во время выполнения фактического resttemplate вызывается вместо моего макете resttemplate.

Пожалуйста, предложите, как я могу издеваться над RestTemplate для моего тестового примера.

+0

Можете ли вы поделиться своим тест-applicationContext.xml –

+0

Hi Tharsan, это мой тест-applicationContext.xml \t <контекст <- - компонент сканирования!>: Компонент сканирования базовый пакет = "mybasepackage "/> \t <контекст: annotation-config /> \t \t \t <конструктор-Arg значение = "org.springframework.web.client.RestTemplate"/> \t \t – Ashwini

ответ

0

Класс util создает свой собственный RestTemplate, как вы сказали: RestTemplate restTemplate = new RestTemplate() ;.

Это означает, что он будет использовать его, а не тот, который насмехается в тесте. Вы можете либо сделать RestTemplate управляемым bean-компонентом в вашем фактическом коде, либо использовать метод setter для класса util, и вызвать этот сеттер в тесте, используя шаблон измеченного отдыха.

+0

могли бы вы подробнее остановиться на" у сеттера метод на классе утилиты и вызывать этот сеттер в тесте с использованием шаблона с наддувом отдыха »с примером. В чем преимущество вызова метода setter в классе util с использованием издевавшегося RESTTemplate. Кроме того, издевательский RestTemplate не запускается во время работы мой unittest – Ashwini

0

Основываясь на предоставленной информации, я могу сказать, что попробую внести следующие изменения и проверить, не решена ли ваша проблема. Что я могу видеть это, так как вы autowire в WebApplicationContext, как

@Autowired private WebApplicationContext webApplicationContext; 

Это может возможно развитие профиль получать инъекции, а тестовый профиль. Следовательно, вы можете поместить эту аннотацию, чтобы пометить класс в профиле испытания в верхней части тестового класса

@RunWith(SpringJUnit4ClassRunner.class) 

Тем не менее, если у вас есть вопросы, автоматические проволочные шаблон остальных правильно с RestTemplate, например, как показано ниже.

@Autowired 
@Qualifier("restTemplate") 
private RestTemplate restTemplate; 

 Смежные вопросы

  • Нет связанных вопросов^_^