package org.xmx0632.deliciousfruit.service.account;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.fail;
import java.util.Date;
import org.junit.Before;
import org.junit.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.springside.modules.test.security.shiro.ShiroTestUtils;
import org.springside.modules.utils.DateProvider.ConfigurableDateProvider;
import org.xmx0632.deliciousfruit.data.UserData;
import org.xmx0632.deliciousfruit.entity.User;
import org.xmx0632.deliciousfruit.repository.TaskDao;
import org.xmx0632.deliciousfruit.repository.UserDao;
import org.xmx0632.deliciousfruit.service.ServiceException;
/**
* AccountService的测试用例, 测试Service层的业务逻辑.
*
* @author calvin
*/
public class AccountServiceTest {
@InjectMocks
private UserService userService;
@Mock
private UserDao mockUserDao;
@Mock
private TaskDao mockTaskDao;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
ShiroTestUtils.mockSubject(new ShiroUser(3L, "foo", "Foo"));
}
@Test
public void registerUser() {
User user = UserData.randomNewUser();
Date currentTime = new Date();
userService.setDateProvider(new ConfigurableDateProvider(currentTime));
userService.registerUser(user);
// 验证user的角色,注册日期和加密后的密码都被自动更新了。
assertEquals("user", user.getRoles());
assertEquals(currentTime, user.getRegisterDate());
assertNotNull(user.getPassword());
assertNotNull(user.getSalt());
}
@Test
public void updateUser() {
// 如果明文密码不为空,加密密码会被更新.
User user = UserData.randomNewUser();
userService.updateUser(user);
assertNotNull(user.getSalt());
// 如果明文密码为空,加密密码无变化。
User user2 = UserData.randomNewUser();
user2.setPlainPassword(null);
userService.updateUser(user2);
assertNull(user2.getSalt());
}
@Test
public void deleteUser() {
// 正常删除用户.
userService.deleteUser(2L);
Mockito.verify(mockUserDao).delete(2L);
// 删除超级管理用户抛出异常, userDao没有被执行
try {
userService.deleteUser(1L);
fail("expected ServicExcepton not be thrown");
} catch (ServiceException e) {
// expected exception
}
Mockito.verify(mockUserDao, Mockito.never()).delete(1L);
}
}