2016-05-26 11 views
5

Rozwijam się po podstawowych przykładach Spring Boot, dodając zależność od repozytorium "autowired" do kontrolera. Chciałbym zmodyfikować testy jednostkowe, aby wstrzyknąć próbkę Mockito dla tej zależności, ale nie jestem pewien jak.Jak kpić z autoczyszczonych zależności w testach Spring Boot MockMvc Unit?

Spodziewałem się, że mogę zrobić coś takiego:

@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("[]"))); 
    } 
} 

ale nie wstrzyknąć makiety do MockMvc. Czy ktoś może wyjaśnić, jak to zrobić z zależnościami @Autowired, a nie z argumentami konstruktora?

+1

utworzyć konfigurację, która zawiera makiety swoich fasoli. Następnie w konfiguracji zresetuj makiety. (W Spring Boot 1.4 będziesz mógł dodać adnotację '@ MockBean', która to ułatwia). –

Odpowiedz

6

Proszę używać @RunWith(MockitoJUnitRunner.class) zamiast @RunWith(SpringJUnit4ClassRunner.class) i trzeba użyć pola ExampleController exampleController; z wprowadzoną mocks zamiast tworzyć nowy w linii mvc = MockMvcBuilders.standaloneSetup(new ExampleController()).build();

+0

To jest interesujące. Nie słyszałem o tej klasie. Jednak nie wydaje się, aby ta jedna zmiana spowodowała automatyczną autogenną zależność –

+0

Spróbuj użyć @RunWith (Mockito ...) i użyj w tym wierszu 'mvc = MockMvcBuilders.standaloneSetup (new ExampleController()). Build (); 'the exampleController z wstrzykniętymi mockami. Jeśli utworzysz nowe wystąpienie przykładowego kontrolera, tak jak w tym wierszu, nie zostanie zastosowane automatyczne okablowanie. –

+0

ładny. To wydaje się być podstępem. Jeśli masz szansę, zaktualizuj swoją odpowiedź, aby uwzględnić te dodatkowe informacje. A także, dziękuję ci za uratowanie mnie. –