2016-04-28 9 views
0

Ich habe erholsamen Dienste und ich möchte Einheit sie testen, ohne auf die Datenbank zu verbinden, deshalb habe ich dieses Stück Code geschrieben:Warum MVM und Mockito nicht zusammenarbeiten?

@Before 
public void setup() throws Exception { 
    this.mockMvc = webAppContextSetup(webApplicationContext).build(); 

    adminDao = mock(AdminDaoImpl.class); 
    adminService = new AdminServiceImpl(adminDao); 
} 

@Test 
public void getUserList_test() throws Exception { 
    User user = getTestUser(); 
    List<User> expected = spy(Lists.newArrayList(user)); 

    when(adminDao.selectUserList()).thenReturn(expected); 


    mockMvc.perform(get("/admin/user")) 
     .andExpect(status().isOk()) 
     .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8_VALUE)) 
     .andExpect(jsonPath("$", hasSize(1))) 
     ;   
} 

Der Dienst wird aufgerufen, aber mein Problem ist, diese Zeile Code

when(adminDao.selectUserList()).thenReturn(expected); 

funktioniert nicht, ich meine, es ruft wirklich die adminDao.select-Methode und daher das Ergebnis aus der Datenbank. was ich nicht will. Haben Sie eine Idee, wie kann ich den Methodenaufruf verspotten?

+1

Sie funktionieren perfekt zusammen, aber Sie spotten Klassen außerhalb des Kontexts, wie sollte der Kontext über diese Mocks wissen? –

+0

@ M.Deinum Sie haben Recht, ich weiß, dass ich WebApplicationContext bekomme, aber eigentlich kann ich keine Möglichkeit finden, sie im MockMVC-Kontext zu verspotten. Wie kann ich es reparieren? – Shilan

+0

Erstellen Sie eine Konfigurationsklasse, die die tatsächlichen Beans mit Mocks überschreibt. Injizieren Sie die Mocks in unserer Testklasse, um das gewünschte Verhalten aufzuzeichnen. –

Antwort

1

Dank @M. Deinum, ich mein Problem behoben, fügte ich eine Testcontext-Konfigurationsdatei:

@Configuration 
public class TestContext { 

@Bean 
public AdminDaoImpl adminDao() { 
    return Mockito.mock(AdminDaoImpl.class); 
} 

@Bean 
public AdminServiceImpl adminService() { 
    return new AdminServiceImpl(adminDao()); 
}  
} 

und dann in meiner Test-Klasse kommentierte ich die Klasse mit

@ContextConfiguration(classes = {TestContext.class}) 

Wert in setUp der Testklasse zu erwähnen, ich brauche um die mockedClass zurückzusetzen, um ein Auslaufen zu verhindern:

Verwandte Themen