gpt4 book ai didi

java - 具有 Spring Security 的 Spring MVC 测试 Controller

转载 作者:行者123 更新时间:2023-12-01 09:40:12 24 4
gpt4 key购买 nike

我正在尝试编写测试 Controller 的测试用例,这是 Controller 的代码

@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("admin@akb.co.jp");
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("alice.lin@akb.co.jp");
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());在我的 Controller 类中,当我运行 Maven 测试时,它会抛出空指针异常,这是显而易见的,因为在我的测试用例中我没有登录到应用程序。我该怎么做才能使测试通过并包含这一行?

最佳答案

您应该重构代码,以便 getCurrentUser() 调用位于单独的类中。无论如何,您应该将它们分开,因为很可能其他 Controller 需要进行相同的调用。但对于这种情况,您需要重构,因为您无法模拟私有(private)方法调用(至少不能使用 Mockito)。

一旦用户相关的调用位于单独的类中,您就可以使用 @Mock 注释来模拟它,就像您完成上述其他服务一样。

关于java - 具有 Spring Security 的 Spring MVC 测试 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38516666/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com