2016-07-22 238 views
0

我試圖編寫測試用例的測試控制器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的測試中,它會拋出空指針異常,這是顯而易見,因爲在我的測試用例沒有登錄到應用程序。我可以做什麼,這樣我可以通過測試包括這一行?

回答

1

您應該重構您的代碼,以便getCurrentUser()調用位於單獨的類中。你應該保持這些分開,因爲很可能其他控制器將需要進行相同的呼叫。但是對於這種情況,你需要重構因爲你不能模擬私人方法調用(至少不使用Mockito)。

一旦與用戶相關的調用位於單獨的類中,就可以像使用@Mock註釋一樣完成上述其他服務。

+0

它可以工作,但實際應用程序中還有一個問題,listUsers()將在用戶登錄系統後調用,例如,用戶名是「admin」,因此「loggedinuser」將設置爲「admin」。是否有任何方法可以在測試中處理這個問題?像'Assert.assertEquals(model.get(「loggedinuser」),「admin」);'會通過嗎? –

+0

嘗試類似: when(loggedInService.getPrincipal())。thenReturn(「admin」); – starman1979

+0

作品,謝謝 –