我試圖編寫測試用例的測試控制器Spring MVC的測試控制器,這裏是控制器彈簧安全
@Controller
@RequestMapping("/")
@SessionAttributes({"roles", "departments"})
public class AppController {
@Autowired
UserService userService;
@Autowired
RoleService roleService;
@Autowired
DepartmentService departmentService;
@Autowired
MessageSource messageSource;
@Autowired
PersistentTokenBasedRememberMeServices persistentTokenBasedRememberMeServices;
@Autowired
AuthenticationTrustResolver authenticationTrustResolver;
static final Logger logger = LoggerFactory.getLogger(AppController.class);
/**
* This method will list all existing users.
*/
@RequestMapping(value = { "/", "/list" }, method = RequestMethod.GET)
public String listUsers(ModelMap model) {
List<User> users = userService.findAllUsers();
model.addAttribute("users", users);
model.addAttribute("loggedinuser", getPrincipal());
return "userslist";
}
/**
* This method returns the principal[user-name] of logged-in user.
*/
private String getPrincipal(){
String userName = null;
Object principal = getCurrentUser();
if (principal instanceof UserDetails) {
userName = ((UserDetails)principal).getUsername();
} else {
userName = principal.toString();
}
return userName;
}
private Object getCurrentUser(){
return SecurityContextHolder.getContext().getAuthentication().getPrincipal();
}
//The rest part of the controller}
我使用基於本教程TestNG的代碼:http://websystique.com/springmvc/spring-4-mvc-and-hibernate4-integration-testing-example-using-annotations/,目前我具有以下在我的測試案例:
//all the import file
public class AppControllerTest {
@Mock
UserService userService;
@Mock
MessageSource message;
@InjectMocks
AppController appController;
@Spy
List<User> users = new ArrayList<User>();
@Spy
ModelMap model;
@Mock
BindingResult result;
@BeforeClass
public void setUp(){
MockitoAnnotations.initMocks(this);
users = getUsers();
}
private List<User> getUsers() {
// TODO Auto-generated method stub
User u1 = new User();
u1.setId(1);
u1.setFirstName("Admin");
u1.setLastName("Admin");
u1.setUsername("admin");
u1.setEmail("[email protected]");
u1.setDateOfBirth(new LocalDate());
u1.setPassword("admin");
Department admin = new Department();
admin.setId(1);
admin.setName("Admin");
admin.setDescription("Admin");
u1.setDepartment(admin);
Role adminRole = new Role();
adminRole.setId(1);
adminRole.setRoleName("ADMIN");
Set<Role> roles = new HashSet<>();
roles.add(adminRole);
u1.setRoles(roles);
User u2 = new User();
u2.setId(1);
u2.setFirstName("Alice");
u2.setLastName("Lin");
u2.setUsername("alice.lin");
u2.setEmail("[email protected]");
u2.setDateOfBirth(new LocalDate());
u2.setPassword("Alice0102");
u2.setDepartment(admin);
u2.setRoles(roles);
users.add(u1);
users.add(u2);
return users;
}
@Test
public void listUsers(){
when(userService.findAllUsers()).thenReturn(users);
Assert.assertEquals(appController.listUsers(model), "userslist");
Assert.assertEquals(model.get("users"), users);
verify(userService, atLeastOnce()).findAllUsers();
}
}
現在的問題是,如果我不評論這條線model.addAttribute("loggedinuser", getPrincipal());
在我的控制器類,當我運行Maven的測試中,它會拋出空指針異常,這是顯而易見,因爲在我的測試用例沒有登錄到應用程序。我可以做什麼,這樣我可以通過測試包括這一行?
它可以工作,但實際應用程序中還有一個問題,listUsers()將在用戶登錄系統後調用,例如,用戶名是「admin」,因此「loggedinuser」將設置爲「admin」。是否有任何方法可以在測試中處理這個問題?像'Assert.assertEquals(model.get(「loggedinuser」),「admin」);'會通過嗎? –
嘗試類似: when(loggedInService.getPrincipal())。thenReturn(「admin」); – starman1979
作品,謝謝 –