2016-05-26 4 views
5

Я расширяю базовые примеры Spring Boot, добавляя зависимую от репозитория «autwired» для моего контроллера. Я хотел бы изменить модульные тесты, чтобы внедрить Mockito mock для этой зависимости, но я не уверен, как это сделать.Как издеваться над автозависимыми зависимостями в Spring Boot MockMvc?

Я ожидал, что я мог бы сделать что-то вроде этого:

@RunWith(SpringJUnit4ClassRunner.class) 
@SpringApplicationConfiguration(classes = MockServletContext.class) 
@WebAppConfiguration 
public class ExampleControllerTest { 

    private MockMvc mvc; 

    @InjectMocks 
    ExampleController exampleController; 

    @Mock 
    ExampleRepository mockExampleRepository; 

    @Before 
    public void setUp() throws Exception { 
     MockitoAnnotations.initMocks(this); 
    mvc = MockMvcBuilders.standaloneSetup(new ExampleController()).build(); 
    } 

    @Test 
    public void getExamples_initially_shouldReturnEmptyList() throws Exception { 
     mvc.perform(MockMvcRequestBuilders.get("/example").accept(MediaType.APPLICATION_JSON)) 
       .andExpect(status().isOk()) 
       .andExpect(content().string(equalTo("[]"))); 
    } 
} 

но не впрыскивать макет в MockMvc. Может ли кто-нибудь объяснить, как это сделать с помощью зависимостей @Autowired, а не от аргументов конструктора?

+1

Создать конфигурацию, которая содержит макет ваших бобов. Затем в вашей настройке сбросьте насмешки. (В Spring Boot 1.4 вы сможете добавить аннотацию '@ MockBean', которая делает это проще). –

ответ

6

@RunWith(MockitoJUnitRunner.class) Пожалуйста, используйте вместо @RunWith(SpringJUnit4ClassRunner.class) и вы должны использовать ExampleController exampleController; поля с инжектированным издевается вместо того, чтобы создавать новую в соответствии mvc = MockMvcBuilders.standaloneSetup(new ExampleController()).build();

+0

Это интересно. Я не слышал об этом классе. Тем не менее, похоже, что это одно из изменений не приводит к тому, что макет зависимости зависит от автозагрузки –

+0

Попробуйте использовать @RunWith (Mockito ...) и используйте в этой строке 'mvc = MockMvcBuilders.standaloneSetup (new ExampleController()). Build (); 'exampleController с инъецированными mocks. Если вы создадите новый экземпляр примерного контроллера, как в этой строке, автоматическая проводка не будет применена. –

+0

приятно. Кажется, это трюк. Если у вас есть шанс, обновите свой ответ, чтобы включить эту дополнительную информацию, пожалуйста. А также, спасибо, что спасли мне кучу времени. –

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