У меня есть UserDAO, у которого есть методы, такие как add, delete, update, getUser и getUsers (для манипулирования моей базой данных).У меня также есть Requestmapping, который я хочу протестировать через Mockito.Вот все, что имеет отношение к тому, что у меня есть:
Тест:
@RunWith(SpringJUnit4ClassRunner.class)
@WebMvcTest(value = UserController.class)
public class UserControllerTest
{
@Autowired
private MockMvc mockMvc;
@Mock
private UserDAO userDao;
@InjectMocks
private UserController userController;
@Before
public void setUp()
{
MockitoAnnotations.initMocks(this);
mockMvc = MockMvcBuilders
.standaloneSetup(userController)
.build();
}
@Test
public void testGetAllUsersSuccess() throws Exception{
User s = new User();
List<User> users = Arrays.asList(
new User(1,"somebody", "pass", "somebody@yahoo.com"),
new User(2, "sam", "mypass", "tom@hotmail.com"));
doReturn(users).when(userDao).getUsers();
mockMvc.perform(get("/userList"))
.andExpect(status().isOk())
.andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8_VALUE))
.andExpect(jsonPath("$", hasSize(2)))
.andExpect(jsonPath("$[0].userID", is(1)))
.andExpect(jsonPath("$[0].name", is("somebody")))
.andExpect(jsonPath("$[0].password", is("pass")))
.andExpect(jsonPath("$[0].email", is("somebody@yahoo.com")))
.andExpect(jsonPath("$[1].userID", is(2)))
.andExpect(jsonPath("$[1].name", is("sam")))
.andExpect(jsonPath("$[1].password", is("mypass")))
.andExpect(jsonPath("$[1].email", is("tom@hotmail.com")));
verify(userDao, times(1)).getUsers();
verifyNoMoreInteractions(userDao);
}
}
UserController, где у меня есть мое сопоставление запросов:
@RestController
public class UserController {
/**
*
*
* @return list of all users
*/
@RequestMapping(value = "/userList", method = RequestMethod.GET)
public List<User> user() throws Exception {
UserDAO gettingUsers = new UserDAO();
return gettingUsers.getUsers();
}
}
метод getUsers ():
public List<User> getUsers(){
try(Session session = HibernateUtil.getSessionFactory().openSession()){
return session.createQuery("from User", User.class).getResultList();
}
}
ПРОБЛЕМА: Когда я выполняю свой тест, устанавливается соединение с базой данных (а это не то, что мне нужно) вместо поддельного экземпляра UserDAO, который возвращает только users список, который я сделал в mockito.
ВОПРОС: Как должен выглядеть мой код, чтобы иметь возможность смоделировать метод getUsers () userDAO таким образом, чтобы он невернуть пользователей из базы данных, но вместо этого возвращает фальшивый список пользователей, когда я вызываю его, запрашивая метод get "/ userList"?
UPDATE =
РЕШЕНИЕ:
Мой новый контроллер:
@RestController
public class UserController {
private UserDAO userDAO;
public UserController (UserDAO userDAO)
{
this.userDAO = userDAO;
}
/**
*
*
* @return list of all users
*/
@GetMapping(value = "/Users", method = RequestMethod.GET)
public List<User> users() throws Exception {
return userDAO.getUsers();
}
}
Изменения, сделанные в тесте:
//...
@MockBean
private UserDAO userDao;
....
when(userDao.getUsers()).thenReturn(users);
...//
Spring не нашел моего пользователя DAO Bean такЯ добавил имя пакета, в котором хранил компонент, в моем классе ApplicationConfiguration.Делая это, Spring смог внедрить bean-компонент в конструктор.