Метод DAO не подвергается насмешкам - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть 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-компонент в конструктор.

1 Ответ

0 голосов
/ 27 февраля 2019

Макет userDao никогда не устанавливается на тестируемый контроллер.

1) Вы не хотите использовать new для создания экземпляра UserDAO в вашем контроллере:

 UserDAO gettingUsers = new UserDAO();

Вы хотите внедрить его как Spring Bean.
Кроме того, вы также должны сделать зависимость видимой, потому что на самом деле ее нельзя установить из POV модульного теста.

Вы можете добавить его в конструктор:

private UserDAO userDAO;
public UserController (UserDAO userDAO){
  this.userDAO = userDAO;
}

2) Вы макете Spring bean в работающем контейнере с @MockBean из теста Spring Boot, а не с @Mock из Mockito.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...