2016-05-26 5 views
5

Ich erweitere die grundlegenden Spring Boot-Beispiele, indem ich meinem Controller eine "autowired" Repository-Abhängigkeit hinzufüge. Ich würde gerne die Unit-Tests modifizieren, um einen Mockito-Mock für diese Abhängigkeit zu injizieren, aber ich bin mir nicht sicher, wie.Wie autowired Abhängigkeiten in Spring Boot MockMvc Unit Tests Mock Move?

Ich hatte erwartet, dass ich so etwas tun könnte:

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

aber das Mock in die MockMvc nicht injizieren. Kann jemand erklären, wie man das mit @Autowired Abhängigkeiten tut, anstatt Konstruktorargumente?

+1

eine Konfiguration erstellen, die ein Modell Ihrer Bohnen enthalten. Dann setze in deinem Setup die Mocks zurück. (In Spring Boot 1.4 können Sie eine '@ MockBean' Annotation hinzufügen, die das erleichtert). –

Antwort

6

Bitte benutzen Sie @RunWith(MockitoJUnitRunner.class) statt @RunWith(SpringJUnit4ClassRunner.class) und Sie haben das ExampleController exampleController; Feld mit den injizierten Mocks zu verwenden, anstatt einen neuen in Linie zu schaffen mvc = MockMvcBuilders.standaloneSetup(new ExampleController()).build();

+0

Das ist interessant. Ich hatte nichts von dieser Klasse gehört. Es scheint jedoch nicht, dass diese eine Änderung dazu führt, dass die Scheinabhängigkeit autowired wird –

+0

Bitte versuchen Sie @RunWith (Mockito ...) zu verwenden und verwenden Sie in dieser Zeile 'mvc = MockMvcBuilders.standaloneSetup (new ExampleController()).); 'exampleController mit den injizierten Mocks. Wenn Sie eine neue Instanz des Beispielcontrollers wie in dieser Zeile erstellen, wird keine automatische Verdrahtung angewendet. –

+0

nett. Das scheint der Trick zu sein. Wenn Sie eine Chance bekommen, aktualisieren Sie bitte Ihre Antwort, um diese zusätzlichen Informationen hinzuzufügen. Und auch, danke, dass du mir eine Menge Zeit gespart hast. –

Verwandte Themen