Java DAO方法没有被嘲笑

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

我有一个UserDAO,它有add、delete、update、getUser和getUsers(用来操作我的数据库)等方法。我还想通过Mockito测试一个Requestmapping。以下是我所拥有的一切相关信息:

测试:

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