我目前被分配为一个项目创建Junit测试。我创建了一些测试,但是在阅读了一些最佳实践之后,我发现Junit测试不应该影响真实数据,因为它可以构成数据的完整性。
下面的一个测试示例测试存储库中现有用户数据的编辑:
@Test
void EditUserTest()
{
UserController userController = new UserController();
List<User> userList = (List<User>) userController.getCurrentUserlist();
RoleController roleController = new RoleController();
List<Role> roleList = (List<Role>) roleController.GetCurrentRolelist();
User selectedUser = userList.get(0);
selectedUser.setLoginName("EditedLoginName");
selectedUser.setFirstName("EditedFirstName");
selectedUser.setLastName("EditedLastName");
selectedUser.setEmployeeID(555555555);
selectedUser.setRole(roleList.get(6));
selectedUser.setAutoLogoutPeriod(6);
selectedUser.setEksSerial("45f869");
selectedUser.setEksLevel(9);
User NonExistent = new User();
assertTrue(userController.EditUser(selectedUser), "Testing edit to User in repository");
assertFalse(userController.EditUser(NonExistent), "Testing edit to Non-Existent User in repository");
User editedUser = userController.GetUser(selectedUser.getID());
assertEquals("EditedLoginName", editedUser.getLoginName(), "Testing edit to User Login name");
assertEquals("EditedFirstName", editedUser.getFirstName(), "Testing edit to User First name");
assertEquals("EditedLastName", editedUser.getLastName(), "Testing edit to User Last name");
assertEquals(55555555, editedUser.getEmployeeID(), "Testing edit to User Employee ID");
assertEquals(roleList.get(6), editedUser.getRole(), "Testing edit to User Role");
assertEquals("45f869", editedUser.getEksSerial(), "Testing edit to User Eks Serial");
assertEquals(9, editedUser.getEksLevel(), "Testing edit to User Eks Level");
}
如您所见,我检索了存储库中的当前用户列表,并仅获取第一个。更改其值后,我然后使用控制器对存储库进行实际编辑,然后从存储库中检索同一用户以进行比较,并查看是否实际进行了编辑。现在,我将如何测试同一件事,而又不影响存储库中的实际数据?
答案 0 :(得分:0)
单元测试不应访问真实数据。您需要模拟任何此类数据,以便不影响实际数据。
单元测试的目的是测试功能,它不依赖于实际数据。
您可以查看Mockito,以模拟表现出实际对象行为的对象。
此链接可能会有所帮助:Official docs
答案 1 :(得分:0)
如果您正在编写单元测试,则您的测试应仅专注于要测试的组件,这意味着,如果您在测试控制器层,则不应调用服务层或dao层并使用其功能。
假设您要测试您的控制器,然后应该使用Mockito或任何其他测试框架来模拟服务层。通过模拟,您基本上可以避免实际的服务调用,而继续进行控制器级别的测试。