严智鑫
2025-11-13 945bc394f40d8af1072a53da9a94f24207124e6d
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
/*******************************************************************************
 * Copyright (c) 2005, 2014 springside.github.io
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 *******************************************************************************/
package com.northglass.service.account;
 
import static org.assertj.core.api.Assertions.*;
 
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 com.northglass.data.UserData;
import com.northglass.entity.User;
import com.northglass.repository.TaskDao;
import com.northglass.repository.UserDao;
import com.northglass.service.ServiceException;
import com.northglass.service.account.ShiroDbRealm.ShiroUser;
import org.springside.modules.test.security.shiro.ShiroTestUtils;
import org.springside.modules.utils.Clock.MockClock;
 
/**
 * AccountService的测试用例, 测试Service层的业务逻辑.
 * 
 * @author calvin
 */
public class AccountServiceTest {
 
    @InjectMocks
    private AccountService accountService;
 
    @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();
        accountService.setClock(new MockClock(currentTime));
 
        accountService.registerUser(user);
 
        // 验证user的角色,注册日期和加密后的密码都被自动更新了。
        assertThat(user.getRoles()).isEqualTo("user");
        assertThat(user.getRegisterDate()).isEqualTo(currentTime);
        assertThat(user.getPassword()).isNotNull();
        assertThat(user.getSalt()).isNotNull();
    }
 
    @Test
    public void updateUser() {
        // 如果明文密码不为空,加密密码会被更新.
        User user = UserData.randomNewUser();
        accountService.updateUser(user);
        assertThat(user.getSalt()).isNotNull();
 
        // 如果明文密码为空,加密密码无变化。
        User user2 = UserData.randomNewUser();
        user2.setPlainPassword(null);
        accountService.updateUser(user2);
        assertThat(user2.getSalt()).isNull();
    }
 
    @Test
    public void deleteUser() {
        // 正常删除用户.
        accountService.deleteUser(2L);
        Mockito.verify(mockUserDao).delete(2L);
 
        // 删除超级管理用户抛出异常, userDao没有被执行
        try {
            accountService.deleteUser(1L);
            failBecauseExceptionWasNotThrown(ServiceException.class);
        } catch (ServiceException e) {
            // expected exception
        }
        Mockito.verify(mockUserDao, Mockito.never()).delete(1L);
    }
 
}