通常,我們的接口是會作登錄校驗的,爲了安全,有些接口甚至有權限校驗,這樣,通常的單元測試就很難通過,此處以第一種情況爲例:
1. 接口(在接口內調用了當前登錄的用戶信息,如果發現不存在則會拋出異常)
@PostMapping("/save")
public Object save (@RequestBody @Valid final UserPage userPage, final HttpServletRequest request) {
final User user = new User();
BeanUtils.copyProperties(userPage, user);
final Date now = new Date();
user.setUpdateTime(now);
if (user.getValidBeginTime() != null && user.getValidEndTime() != null && !user.getValidBeginTime().before(user.getValidEndTime())) {
throw new BusinessException(ExceptionEnum.EXECUTE_BASE_CHECK_EXCPTION.setExceptionMsg("有效開始時間不能晚於有效結束時間"));
}
//根據用戶名判斷是否已經存在該類型
User temp = userDao.queryByUserName(userPage.getUserName());
if (userPage.getId() != null) {
//修改
if (temp != null && !temp.getId().equals(user.getId())) {
systemLogService.add(request, Constant.SYSTEM_LOG_MODULE_USER, Constant.SYSTEM_LOG_TYPE_MODIFY, "修改用戶信息失敗");
throw new BusinessException(ExceptionEnum.EXECUTE_BASE_CHECK_EXCPTION.setExceptionMsg("數據已存在"));
}
temp = (User) userDao.queryById(userPage.getId() );
userDao.update(user);
systemLogService.add(request, Constant.SYSTEM_LOG_MODULE_USER, Constant.SYSTEM_LOG_TYPE_MODIFY, "修改用戶信息");
} else {
//新增
//修改
if (temp != null) {
systemLogService.add(request, Constant.SYSTEM_LOG_MODULE_USER, Constant.SYSTEM_LOG_TYPE_MODIFY, "新增用戶信息失敗");
throw new BusinessException(ExceptionEnum.EXECUTE_BASE_CHECK_EXCPTION.setExceptionMsg("數據已存在"));
}
user.setCreateUserId(UserUtils.getCurrentUser().getId());
user.setCreateTime(now);
userDao.add(user);
systemLogService.add(request, Constant.SYSTEM_LOG_MODULE_USER, Constant.SYSTEM_LOG_TYPE_MODIFY, "新增用戶信息");
}
return "保存成功";
}
public class UserUtils {
/**
* 獲取當前用戶信息
* @return
* @throws AuthChallengeException
*/
public static User getCurrentUser () {
final Subject subject = SecurityUtils.getSubject();
if (subject == null) {
throw new BusinessException(ExceptionEnum.EXECUTE_AUTHORICATION_EXCEPTION.setExceptionMsg("用戶未登錄,或登錄已過期"));
} else {
final Session session = subject.getSession();
if (session == null) {
throw new BusinessException(ExceptionEnum.EXECUTE_AUTHORICATION_EXCEPTION.setExceptionMsg("用戶未登錄,或登錄已過期"));
} else {
final User user = (User) session.getAttribute("user");
if (user == null) {
throw new BusinessException(ExceptionEnum.EXECUTE_AUTHORICATION_EXCEPTION.setExceptionMsg("用戶未登錄,或登錄已過期"));
}
return user;
}
}
}
}
2. 單元測試
@RunWith(SpringRunner.class)
@SpringBootTest
public class BaseTest {
@Autowired
org.apache.shiro.mgt.SecurityManager securityManager;
@Autowired
WebApplicationContext webApplicationContext;
public MockMvc mockMvc;
private void login(String username, String password) {
final UsernamePasswordToken token = new UsernamePasswordToken(username, password);
final Subject subject = SecurityUtils.getSubject();
subject.login(token);
}
@Before
public void before() {
SecurityUtils.setSecurityManager(securityManager);
mockMvc = MockMvcBuilders
.webAppContextSetup(webApplicationContext)
.build();
login("admin", null);
}
}
public class UserControllerTest extends BaseTest {
@Test
public void testSave() throws Exception {
final UserPage userPage = new UserPage();
userPage.setUserName("[email protected]");
userPage.setEmail("[email protected]");
userPage.setCompanyId(1);
userPage.setCompanyName("終端公司");
userPage.setName("測試");
userPage.setPhone("18874551022");
userPage.setRoleId(1);
userPage.setRoleName("系統管理員");
final String jsonStr = JSONObject.toJSONString(userPage);
final MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders.post("/user/save")
.contentType(MediaType.APPLICATION_JSON)
.content(jsonStr)
.accept(MediaType.APPLICATION_JSON))
.andDo(MockMvcResultHandlers.print())
.andReturn();
int status = mvcResult.getResponse().getStatus();
assertEquals(200, status);
}
}