Skip to content

Commit 8dfa1ba

Browse files
Implement UserService layer and unit tests, update configs
1 parent 27d51fd commit 8dfa1ba

File tree

7 files changed

+178
-19
lines changed

7 files changed

+178
-19
lines changed

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,19 +44,19 @@ mvn checkstyle:check
4444
```sh
4545
mvn test
4646
```
47-
### 6. Формирование отчета о тестах
47+
### 5. Формирование отчета о тестах
4848

4949
```sh
5050
mvn verify
5151
```
5252

53-
### 5. Запустить приложение
53+
### 6. Запустить приложение
5454

5555

5656
```sh
5757
mvn exec:java -Dexec.mainClass="myuserservice.App"
5858
```
5959

60-
### 6. Пример работы приложения
60+
### 7. Пример работы приложения
6161
![img_1.png](readme-resources/img_1.png)
6262
![img_2.png](readme-resources/img_2.png)

src/main/java/myuserservice/App.java

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
package myuserservice;
22

3-
import myuserservice.dao.UserDao;
43
import myuserservice.dao.UserDaoImpl;
54
import myuserservice.entity.User;
6-
import myuserservice.util.HibernateUtil;
7-
import org.hibernate.Session;
5+
import myuserservice.service.UserService;
86
import org.slf4j.Logger;
97
import org.slf4j.LoggerFactory;
108

@@ -14,7 +12,7 @@
1412
public class App {
1513
private static final Logger log = LoggerFactory.getLogger(App.class);
1614
private static final Scanner scanner = new Scanner(System.in);
17-
private static final UserDao userDao = new UserDaoImpl();
15+
private static final UserService userService = new UserService(new UserDaoImpl());
1816

1917
public static void main(String[] args) {
2018
try {
@@ -62,12 +60,12 @@ private static void createUser() {
6260
user.setEmail(email);
6361
user.setAge(age);
6462

65-
userDao.save(user);
63+
userService.addUser(user);
6664
log.info("Пользователь {} успешно добавлен.", user);
6765
}
6866

6967
private static void listUsers() {
70-
List<User> users = userDao.findAll();
68+
List<User> users = userService.getAllUsers();
7169
if (users.isEmpty()) {
7270
log.info("Пользователей не найдено.");
7371
} else {
@@ -77,7 +75,7 @@ private static void listUsers() {
7775

7876
private static void findUser() {
7977
long id = readLong("ID: ");
80-
User user = userDao.findById(id);
78+
User user = userService.getUser(id);
8179
if (user != null) {
8280
log.info("Найден пользователь: {}", user);
8381
} else {
@@ -88,7 +86,7 @@ private static void findUser() {
8886

8987
private static void updateUser() {
9088
long id = readLong("ID: ");
91-
User user = userDao.findById(id);
89+
User user = userService.getUser(id);
9290
if (user == null) {
9391
log.warn("Пользователь с ID={} не найден", id);
9492
return;
@@ -101,13 +99,13 @@ private static void updateUser() {
10199
System.out.print("Новый возраст: ");
102100
user.setAge(Integer.parseInt(scanner.nextLine()));
103101

104-
userDao.update(user);
102+
userService.updateUser(user);
105103
log.info("Пользователь обновлён: {}", user);
106104
}
107105

108106
private static void deleteUser() {
109107
long id = readLong("ID: ");
110-
userDao.delete(id);
108+
userService.deleteUser(id);
111109
log.info("Пользователь с ID {} удалён.", id);
112110
}
113111

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package myuserservice.service;
2+
3+
import myuserservice.dao.UserDao;
4+
import myuserservice.entity.User;
5+
import org.slf4j.Logger;
6+
import org.slf4j.LoggerFactory;
7+
8+
import java.util.List;
9+
10+
public class UserService {
11+
private static final Logger log = LoggerFactory.getLogger(UserService.class);
12+
private final UserDao userDao;
13+
14+
public UserService(UserDao userDao) {
15+
this.userDao = userDao;
16+
}
17+
18+
public void addUser(User user) {
19+
if (user.getName() == null || user.getEmail() == null) {
20+
log.error("Имя и Email пользователя не могут быть null");
21+
throw new IllegalArgumentException("Имя и Email пользователя не могут быть null");
22+
}
23+
userDao.save(user);
24+
log.info("Пользователь {} добавлен через сервис.", user);
25+
}
26+
27+
public User getUser(Long id) {
28+
return userDao.findById(id);
29+
}
30+
31+
public List<User> getAllUsers() {
32+
return userDao.findAll();
33+
}
34+
35+
public void updateUser(User user) {
36+
userDao.update(user);
37+
log.info("Пользователь {} обновлён через сервис.", user);
38+
}
39+
40+
public void deleteUser(Long id) {
41+
userDao.delete(id);
42+
log.info("Пользователь с ID {} удалён через сервис.", id);
43+
}
44+
}

src/main/java/myuserservice/util/HibernateUtil.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@ public class HibernateUtil {
1212

1313
private static SessionFactory buildSessionFactory() {
1414
try {
15+
setDefaultIfAbsent("hibernate.connection.url", "jdbc:postgresql://localhost:5432/postgres");
16+
setDefaultIfAbsent("hibernate.connection.username", "postgres");
17+
setDefaultIfAbsent("hibernate.connection.password", "postgres");
18+
1519
return new Configuration()
1620
.configure("hibernate.cfg.xml")
1721
.buildSessionFactory();
@@ -21,6 +25,12 @@ private static SessionFactory buildSessionFactory() {
2125
}
2226
}
2327

28+
private static void setDefaultIfAbsent(String key, String value) {
29+
if (System.getProperty(key) == null) {
30+
System.setProperty(key, value);
31+
}
32+
}
33+
2434
public static SessionFactory getSessionFactory() {
2535
return sessionFactory;
2636
}
@@ -29,4 +39,3 @@ public static void shutdown() {
2939
getSessionFactory().close();
3040
}
3141
}
32-

src/main/resources/hibernate.cfg.xml

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,14 @@
77
<session-factory>
88

99
<property name="hibernate.connection.driver_class">org.postgresql.Driver</property>
10-
<property name="hibernate.connection.url">jdbc:postgresql://localhost:5432/postgres</property>
11-
<property name="hibernate.connection.username">postgres</property>
12-
<property name="hibernate.connection.password">postgres</property>
13-
10+
<property name="hibernate.connection.url">${hibernate.connection.url}</property>
11+
<property name="hibernate.connection.username">${hibernate.connection.username}</property>
12+
<property name="hibernate.connection.password">${hibernate.connection.password}</property>
1413

1514
<property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property>
1615
<property name="hibernate.show_sql">true</property>
1716
<property name="hibernate.hbm2ddl.auto">update</property>
1817

19-
2018
<mapping class="myuserservice.entity.User"/>
2119
</session-factory>
2220
</hibernate-configuration>

src/test/java/myuserservice/dao/UserDaoTest.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import myuserservice.util.HibernateUtil;
55
import org.hibernate.SessionFactory;
66
import org.junit.jupiter.api.*;
7+
import org.testcontainers.containers.PostgreSQLContainer;
78

89
import java.util.List;
910

@@ -12,18 +13,30 @@
1213
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
1314
class UserDaoTest {
1415

16+
static PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>("postgres:16-alpine")
17+
.withDatabaseName("testdb")
18+
.withUsername("test")
19+
.withPassword("test");
20+
1521
private UserDao userDao;
1622
private SessionFactory sessionFactory;
1723

1824
@BeforeAll
1925
void setUp() {
26+
postgres.start();
27+
28+
System.setProperty("hibernate.connection.url", postgres.getJdbcUrl());
29+
System.setProperty("hibernate.connection.username", postgres.getUsername());
30+
System.setProperty("hibernate.connection.password", postgres.getPassword());
31+
2032
sessionFactory = HibernateUtil.getSessionFactory();
2133
userDao = new UserDaoImpl();
2234
}
2335

2436
@AfterAll
2537
void tearDown() {
2638
HibernateUtil.shutdown();
39+
postgres.stop();
2740
}
2841

2942
@BeforeEach
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
package myuserservice.service;
2+
3+
4+
import myuserservice.dao.UserDao;
5+
import myuserservice.entity.User;
6+
import org.junit.jupiter.api.BeforeEach;
7+
import org.junit.jupiter.api.Test;
8+
9+
import java.util.List;
10+
11+
import static org.mockito.Mockito.*;
12+
import static org.junit.jupiter.api.Assertions.*;
13+
14+
15+
public class UserServiceTest {
16+
17+
private UserDao userDao;
18+
private UserService userService;
19+
20+
@BeforeEach
21+
public void setUp() {
22+
userDao = mock(UserDao.class);
23+
userService = new UserService(userDao);
24+
}
25+
26+
@Test
27+
public void addUser_validUser_callsDaoSave(){
28+
User user = new User();
29+
user.setName("Anna");
30+
user.setEmail("[email protected]");
31+
user.setAge(25);
32+
33+
userService.addUser(user);
34+
35+
verify(userDao).save(user);
36+
}
37+
38+
@Test
39+
void addUser_nullName_throwsException() {
40+
User user = new User();
41+
user.setEmail("[email protected]");
42+
43+
Exception ex = assertThrows(IllegalArgumentException.class, () -> userService.addUser(user));
44+
assertEquals("Имя и Email пользователя не могут быть null", ex.getMessage());
45+
verify(userDao, never()).save(any());
46+
}
47+
48+
@Test
49+
void addUser_nullEmail_throwsException() {
50+
User user = new User();
51+
user.setName("Test");
52+
53+
Exception ex = assertThrows(IllegalArgumentException.class, () -> userService.addUser(user));
54+
assertEquals("Имя и Email пользователя не могут быть null", ex.getMessage());
55+
verify(userDao, never()).save(any());
56+
}
57+
58+
@Test
59+
void getUser_delegatesToDao() {
60+
User user = new User();
61+
user.setId(1L);
62+
when(userDao.findById(1L)).thenReturn(user);
63+
64+
User result = userService.getUser(1L);
65+
66+
assertEquals(user, result);
67+
verify(userDao).findById(1L);
68+
}
69+
70+
@Test
71+
void getAllUsers_delegatesToDao() {
72+
List<User> userList = List.of(new User(), new User());
73+
when(userDao.findAll()).thenReturn(userList);
74+
75+
List<User> result = userService.getAllUsers();
76+
77+
assertEquals(2, result.size());
78+
verify(userDao).findAll();
79+
}
80+
81+
@Test
82+
void updateUser_delegatesToDao() {
83+
User user = new User();
84+
userService.updateUser(user);
85+
86+
verify(userDao).update(user);
87+
}
88+
89+
@Test
90+
void deleteUser_delegatesToDao() {
91+
userService.deleteUser(42L);
92+
93+
verify(userDao).delete(42L);
94+
}
95+
96+
}
97+

0 commit comments

Comments
 (0)