package org.springside.examples.miniweb.unit.service.account;
import static org.junit.Assert.*;
import org.easymock.EasyMock;
import org.easymock.IMocksControl;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.security.core.authority.GrantedAuthorityImpl;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springside.examples.miniweb.data.AccountData;
import org.springside.examples.miniweb.entity.account.Authority;
import org.springside.examples.miniweb.entity.account.Role;
import org.springside.examples.miniweb.entity.account.User;
import org.springside.examples.miniweb.service.account.AccountManager;
import org.springside.examples.miniweb.service.account.UserDetailsServiceImpl;
/**
* UserDetailsServiceImpl的测试用例, 测试Service层的业务逻辑.
*
* 使用EasyMock对AccountManager进行模拟.
*
* @author calvin
*/
public class UserDetailsServiceImplTest {
private IMocksControl control = EasyMock.createControl();
private UserDetailsServiceImpl userDetailService;
private AccountManager mockAccountManager;
@Before
public void setUp() {
userDetailService = new UserDetailsServiceImpl();
mockAccountManager = control.createMock(AccountManager.class);
userDetailService.setAccountManager(mockAccountManager);
}
@After
public void tearDown() {
control.verify();
}
@Test
public void loadUserExist() {
//准备数据
String authName = "foo";
User user = AccountData.getRandomUser();
Role role = AccountData.getRandomRole();
user.getRoleList().add(role);
Authority auth = new Authority();
auth.setName(authName);
role.getAuthorityList().add(auth);
//录制脚本
EasyMock.expect(mockAccountManager.findUserByLoginName(user.getLoginName())).andReturn(user);
control.replay();
//执行测试
UserDetails userDetails = userDetailService.loadUserByUsername(user.getLoginName());
//校验结果
assertEquals(user.getLoginName(), userDetails.getUsername());
assertEquals(user.getPassword(), userDetails.getPassword());
assertEquals(1, userDetails.getAuthorities().size());
assertEquals(new GrantedAuthorityImpl(auth.getPrefixedName()), userDetails.getAuthorities().iterator().next());
}
@Test(expected = UsernameNotFoundException.class)
public void loadUserNotExist() {
//录制脚本
EasyMock.expect(mockAccountManager.findUserByLoginName("userNameNotExist")).andReturn(null);
control.replay();
//执行测试
userDetailService.loadUserByUsername("userNameNotExist");
}
}