Java DAO方法没有被嘲笑
我有一个UserDAO,它有add、delete、update、getUser和getUsers(用来操作我的数据库)等方法。我还想通过Mockito测试一个Requestmapping。以下是我所拥有的一切相关信息: 测试:Java DAO方法没有被嘲笑,java,spring,hibernate,get,Java,Spring,Hibernate,Get,我有一个UserDAO,它有add、delete、update、getUser和getUsers(用来操作我的数据库)等方法。我还想通过Mockito测试一个Requestmapping。以下是我所拥有的一切相关信息: 测试: @RunWith(SpringJUnit4ClassRunner.class) @WebMvcTest(value = UserController.class) public class UserControllerTest { @Autowired private
@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);
}
}
Spring没有找到我的userdaobean,所以我在我的ApplicationConfiguration类中添加了存储该Bean的包名。这样,Spring就能够将bean注入到构造函数中。用户DAOmock从未设置到被测试的控制器 1) 您不想使用
new
在控制器中实例化UserDAO
:
UserDAO gettingUsers = new UserDAO();
您希望将其作为SpringBean注入。此外,您还必须使依赖项可见,因为实际上它不可从单元测试POV设置 您可以将其注入构造函数中:
private UserDAO userDAO;
public UserController (UserDAO userDAO){
this.userDAO = userDAO;
}
2) 您可以使用Spring引导测试中的
@MockBean
而不是Mockito中的@mock
在运行容器中模拟Spring bean 不能使用new
创建UserDAO
的实例。你不能模仿它——它在生产中根本不应该起作用。使用@MockBean
“此外,你还必须使依赖项可见,因为它实际上不能从单元测试POV设置”你这是什么意思?对不起。刚刚看到你的留言。我想你明白了:我提到了使用带参数的构造函数。好的,非常感谢你的帮助:)我对Spring和Mockito是新手,所以我在正确配置它们时遇到了一些麻烦
@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);
...//
UserDAO gettingUsers = new UserDAO();
private UserDAO userDAO;
public UserController (UserDAO userDAO){
this.userDAO = userDAO;
}