2016-04-28 5 views
0

У меня есть успокоительные услуги, и я хочу, чтобы блок проверить их без подключения к базе данных, поэтому я написал этот кусок кода:Почему mockMVC и mockito не работают вместе?

@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))) 
     ;   
} 

Служба вызывается, но моя проблема заключается эта строка кода

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

не работает, я имею в виду, что он действительно вызывает метод adminDao.select и, следовательно, получает результат из базы данных. которого я не хочу. Вы знаете, как я могу высмеять вызов метода?

+1

Они прекрасно работают вместе, но вы издеваетесь над классами вне контекста, как должен знать контекст об этих издевательствах? –

+0

@ M.Deinum, вы правы, я знаю, что я получаю webApplicationContext, но на самом деле я не могу найти способ издеваться над ними в контексте mockMVC. Как я могу это исправить? – Shilan

+0

Создайте класс конфигурации, который переопределяет фактические компоненты с помощью mocks. Внесите извинения в нашем тестовом классе, чтобы записать нужное поведение. –

ответ

1

Благодаря @M. Deinum, я исправил мою проблему, я добавил конфигурации TestContext файл:

@Configuration 
public class TestContext { 

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

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

, а затем в моем тестовом классе я аннотированный класс с

@ContextConfiguration(classes = {TestContext.class}) 

стоит упомянуть в параметрирования тестового класса мне нужно для сброса mockedClass для предотвращения утечки:

@Before 
public void setup() throws Exception { 
    Mockito.reset(adminDaoMock); 

    mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build(); 
}