Junit 對具備shiro登錄校驗的接口做單元測試

通常,我們的接口是會作登錄校驗的,爲了安全,有些接口甚至有權限校驗,這樣,通常的單元測試就很難通過,此處以第一種情況爲例:

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);
	}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章