diff --git a/design-patterns/README.md b/design-patterns/README.md
new file mode 100644
index 0000000000..2cca13c9b9
--- /dev/null
+++ b/design-patterns/README.md
@@ -0,0 +1,5 @@
+## Article related
+
+- [The DTO Pattern (Data Transfer Object)]()
+
+
diff --git a/design-patterns/dto-pattern/pom.xml b/design-patterns/dto-pattern/pom.xml
new file mode 100644
index 0000000000..19f66ac596
--- /dev/null
+++ b/design-patterns/dto-pattern/pom.xml
@@ -0,0 +1,31 @@
+
+
+
+ com.baeldung.designpatterns.dtopattern
+ 4.0.0
+ dto-pattern
+ dto-pattern
+
+
+ com.baeldung
+ parent-boot-2
+ 0.0.1-SNAPSHOT
+ ../../parent-boot-2
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+
+ 1.8
+ 1.8
+ UTF-8
+
+
+
\ No newline at end of file
diff --git a/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/Main.java b/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/Main.java
new file mode 100644
index 0000000000..ae6c03f856
--- /dev/null
+++ b/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/Main.java
@@ -0,0 +1,12 @@
+package com.baeldung.designpatterns.dtopattern;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class Main {
+ public static void main(String[] args) {
+ SpringApplication.run(Main.class, args);
+ }
+}
+
diff --git a/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/api/Mapper.java b/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/api/Mapper.java
new file mode 100644
index 0000000000..7f9466b6a4
--- /dev/null
+++ b/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/api/Mapper.java
@@ -0,0 +1,28 @@
+package com.baeldung.designpatterns.dtopattern.api;
+
+import com.baeldung.designpatterns.dtopattern.domain.Role;
+import com.baeldung.designpatterns.dtopattern.domain.User;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static java.util.stream.Collectors.toList;
+
+@Component
+class Mapper {
+ public UserDTO toDto(User user) {
+ String name = user.getName();
+ List roles = user
+ .getRoles()
+ .stream()
+ .map(Role::getName)
+ .collect(toList());
+
+ return new UserDTO(name, roles);
+ }
+
+ public User toUser(UserCreationDTO userDTO) {
+ return new User(userDTO.getName(), userDTO.getPassword(), new ArrayList<>());
+ }
+}
diff --git a/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/api/UserController.java b/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/api/UserController.java
new file mode 100644
index 0000000000..8866d1236f
--- /dev/null
+++ b/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/api/UserController.java
@@ -0,0 +1,51 @@
+package com.baeldung.designpatterns.dtopattern.api;
+
+import com.baeldung.designpatterns.dtopattern.domain.RoleService;
+import com.baeldung.designpatterns.dtopattern.domain.User;
+import com.baeldung.designpatterns.dtopattern.domain.UserService;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+import static java.util.stream.Collectors.toList;
+
+@RestController
+@RequestMapping("/users")
+class UserController {
+
+ private UserService userService;
+ private RoleService roleService;
+ private Mapper mapper;
+
+ public UserController(UserService userService, RoleService roleService, Mapper mapper) {
+ this.userService = userService;
+ this.roleService = roleService;
+ this.mapper = mapper;
+ }
+
+ @GetMapping
+ @ResponseBody
+ public List getUsers() {
+ return userService.getAll()
+ .stream()
+ .map(mapper::toDto)
+ .collect(toList());
+ }
+
+
+ @PostMapping
+ @ResponseBody
+ public UserIdDTO create(@RequestBody UserCreationDTO userDTO) {
+ User user = mapper.toUser(userDTO);
+
+ userDTO.getRoles()
+ .stream()
+ .map(role -> roleService.getOrCreate(role))
+ .forEach(user::addRole);
+
+ userService.save(user);
+
+ return new UserIdDTO(user.getId());
+ }
+
+}
diff --git a/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/api/UserCreationDTO.java b/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/api/UserCreationDTO.java
new file mode 100644
index 0000000000..3a38547cbd
--- /dev/null
+++ b/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/api/UserCreationDTO.java
@@ -0,0 +1,36 @@
+package com.baeldung.designpatterns.dtopattern.api;
+
+import java.util.List;
+
+public class UserCreationDTO {
+
+ private String name;
+ private String password;
+ private List roles;
+
+ UserCreationDTO() {}
+
+ public String getName() {
+ return name;
+ }
+
+ public String getPassword() {
+ return password;
+ }
+
+ public List getRoles() {
+ return roles;
+ }
+
+ void setName(String name) {
+ this.name = name;
+ }
+
+ void setPassword(String password) {
+ this.password = password;
+ }
+
+ void setRoles(List roles) {
+ this.roles = roles;
+ }
+}
diff --git a/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/api/UserDTO.java b/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/api/UserDTO.java
new file mode 100644
index 0000000000..41d4ac2dc9
--- /dev/null
+++ b/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/api/UserDTO.java
@@ -0,0 +1,22 @@
+package com.baeldung.designpatterns.dtopattern.api;
+
+import java.util.List;
+
+public class UserDTO {
+ private String name;
+ private List roles;
+
+ public UserDTO(String name, List roles) {
+ this.name = name;
+ this.roles = roles;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public List getRoles() {
+ return roles;
+ }
+
+}
diff --git a/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/api/UserIdDTO.java b/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/api/UserIdDTO.java
new file mode 100644
index 0000000000..0a4a6c8291
--- /dev/null
+++ b/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/api/UserIdDTO.java
@@ -0,0 +1,14 @@
+package com.baeldung.designpatterns.dtopattern.api;
+
+public class UserIdDTO {
+
+ private String id;
+
+ public UserIdDTO(String id) {
+ this.id = id;
+ }
+
+ public String getId() {
+ return id;
+ }
+}
diff --git a/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/domain/InMemoryRepository.java b/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/domain/InMemoryRepository.java
new file mode 100644
index 0000000000..c947519786
--- /dev/null
+++ b/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/domain/InMemoryRepository.java
@@ -0,0 +1,49 @@
+package com.baeldung.designpatterns.dtopattern.domain;
+
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+
+@Service
+class InMemoryRepository implements UserRepository, RoleRepository {
+
+ private Map users = new LinkedHashMap<>();
+ private Map roles = new LinkedHashMap<>();
+
+ @Override
+ public List getAll() {
+ return new ArrayList<>(users.values());
+ }
+
+ @Override
+ public void save(User user) {
+ user.setId(UUID.randomUUID().toString());
+ users.put(user.getId(), user);
+ }
+
+ @Override
+ public void save(Role role) {
+ role.setId(UUID.randomUUID().toString());
+ roles.put(role.getId(), role);
+ }
+
+ @Override
+ public Role getRoleById(String id) {
+ return roles.get(id);
+ }
+
+ @Override
+ public Role getRoleByName(String name) {
+ return roles.values()
+ .stream()
+ .filter(role -> role.getName().equalsIgnoreCase(name))
+ .findFirst()
+ .orElse(null);
+ }
+
+ @Override
+ public void deleteAll() {
+ users.clear();
+ roles.clear();
+ }
+}
diff --git a/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/domain/Role.java b/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/domain/Role.java
new file mode 100644
index 0000000000..c671741720
--- /dev/null
+++ b/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/domain/Role.java
@@ -0,0 +1,28 @@
+package com.baeldung.designpatterns.dtopattern.domain;
+
+import java.util.Objects;
+
+public class Role {
+ private String id;
+ private String name;
+
+ public Role(String name) {
+ this.name = Objects.requireNonNull(name);
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ void setId(String id) {
+ this.id = Objects.requireNonNull(id);
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = Objects.requireNonNull(name);
+ }
+}
diff --git a/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/domain/RoleRepository.java b/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/domain/RoleRepository.java
new file mode 100644
index 0000000000..d43ea709f3
--- /dev/null
+++ b/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/domain/RoleRepository.java
@@ -0,0 +1,7 @@
+package com.baeldung.designpatterns.dtopattern.domain;
+
+public interface RoleRepository {
+ Role getRoleById(String id);
+ Role getRoleByName(String name);
+ void save(Role role);
+}
diff --git a/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/domain/RoleService.java b/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/domain/RoleService.java
new file mode 100644
index 0000000000..4a5b371fa2
--- /dev/null
+++ b/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/domain/RoleService.java
@@ -0,0 +1,32 @@
+package com.baeldung.designpatterns.dtopattern.domain;
+
+import org.springframework.stereotype.Service;
+
+import java.util.Objects;
+
+@Service
+public class RoleService {
+
+ private RoleRepository repository;
+
+ public RoleService(RoleRepository repository) {
+ this.repository = repository;
+ }
+
+ public Role getOrCreate(String name) {
+ Role role = repository.getRoleByName(name);
+
+ if (role == null) {
+ role = new Role(name);
+ repository.save(role);
+ }
+
+ return role;
+ }
+
+ public void save(Role role) {
+ Objects.requireNonNull(role);
+ repository.save(role);
+ }
+
+}
diff --git a/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/domain/User.java b/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/domain/User.java
new file mode 100644
index 0000000000..086c701620
--- /dev/null
+++ b/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/domain/User.java
@@ -0,0 +1,80 @@
+package com.baeldung.designpatterns.dtopattern.domain;
+
+import javax.crypto.*;
+import javax.crypto.spec.SecretKeySpec;
+import java.nio.charset.StandardCharsets;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+import java.util.Collections;
+import java.util.List;
+import java.util.Objects;
+
+public class User {
+
+ private static SecretKeySpec KEY = initKey();
+
+ static SecretKeySpec initKey(){
+ try {
+ SecretKey secretKey = KeyGenerator.getInstance("AES").generateKey();
+ return new SecretKeySpec(secretKey.getEncoded(), "AES");
+ } catch (NoSuchAlgorithmException ex) {
+ return null;
+ }
+ }
+
+ private String id;
+ private String name;
+ private String password;
+ private List roles;
+
+ public User(String name, String password, List roles) {
+ this.name = Objects.requireNonNull(name);
+ this.password = this.encrypt(password);
+ this.roles = Objects.requireNonNull(roles);
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getPassword() {
+ return password;
+ }
+
+ public void setPassword(String password) {
+ this.password = password;
+ }
+
+ public void addRole(Role role) {
+ roles.add(role);
+ }
+
+ public List getRoles() {
+ return Collections.unmodifiableList(roles);
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ void setId(String id) {
+ this.id = id;
+ }
+
+ String encrypt(String password) {
+ Objects.requireNonNull(password);
+ try {
+ Cipher cipher = Cipher.getInstance("AES");
+ cipher.init(Cipher.ENCRYPT_MODE, KEY);
+ final byte[] encryptedBytes = cipher.doFinal(password.getBytes(StandardCharsets.UTF_8));
+ return new String(encryptedBytes, StandardCharsets.UTF_8);
+ } catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | IllegalBlockSizeException | BadPaddingException e) {
+ // do nothing
+ return "";
+ }
+ }
+}
diff --git a/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/domain/UserRepository.java b/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/domain/UserRepository.java
new file mode 100644
index 0000000000..504f328118
--- /dev/null
+++ b/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/domain/UserRepository.java
@@ -0,0 +1,9 @@
+package com.baeldung.designpatterns.dtopattern.domain;
+
+import java.util.List;
+
+public interface UserRepository {
+ List getAll();
+ void save(User user);
+ void deleteAll();
+}
diff --git a/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/domain/UserService.java b/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/domain/UserService.java
new file mode 100644
index 0000000000..3b5ac86974
--- /dev/null
+++ b/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/domain/UserService.java
@@ -0,0 +1,25 @@
+package com.baeldung.designpatterns.dtopattern.domain;
+
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Objects;
+
+@Service
+public class UserService {
+
+ private UserRepository repository;
+
+ public UserService(UserRepository repository) {
+ this.repository = repository;
+ }
+
+ public List getAll() {
+ return repository.getAll();
+ }
+
+ public void save(User user) {
+ Objects.requireNonNull(user);
+ repository.save(user);
+ }
+}
diff --git a/design-patterns/dto-pattern/src/test/java/com/baeldung/designpatterns/dtopattern/api/MapperUnitTest.java b/design-patterns/dto-pattern/src/test/java/com/baeldung/designpatterns/dtopattern/api/MapperUnitTest.java
new file mode 100644
index 0000000000..8728f6952e
--- /dev/null
+++ b/design-patterns/dto-pattern/src/test/java/com/baeldung/designpatterns/dtopattern/api/MapperUnitTest.java
@@ -0,0 +1,56 @@
+package com.baeldung.designpatterns.dtopattern.api;
+
+import com.baeldung.designpatterns.dtopattern.domain.Role;
+import com.baeldung.designpatterns.dtopattern.domain.User;
+import org.junit.jupiter.api.Test;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+class MapperUnitTest {
+
+ @Test
+ void toDto_shouldMapFromDomainToDTO() {
+ String name = "Test";
+ String password = "test";
+ Role admin = new Role("admin");
+ List expectedRoles = Collections.singletonList("admin");
+
+ List roles = new ArrayList<>();
+ roles.add(admin);
+
+ User user = new User(name, password, roles);
+ Mapper mapper = new Mapper();
+
+ UserDTO dto = mapper.toDto(user);
+
+ assertEquals(name, dto.getName());
+ assertEquals(expectedRoles, dto.getRoles());
+ }
+
+ @Test
+ void toUser_shouldMapFromDTOToDomain() {
+ String name = "Test";
+ String password = "test";
+ String role = "admin";
+
+ UserCreationDTO dto = new UserCreationDTO();
+ dto.setName(name);
+ dto.setPassword(password);
+ dto.setRoles(Collections.singletonList("admin"));
+
+ User expectedUser = new User(name, password, new ArrayList<>());
+
+ Mapper mapper = new Mapper();
+
+ User user = mapper.toUser(dto);
+
+ assertEquals(name, user.getName());
+ assertEquals(expectedUser.getPassword(), user.getPassword());
+ assertEquals(Collections.emptyList(), user.getRoles());
+ }
+
+}
\ No newline at end of file
diff --git a/design-patterns/dto-pattern/src/test/java/com/baeldung/designpatterns/dtopattern/api/UserControllerIntegrationTest.java b/design-patterns/dto-pattern/src/test/java/com/baeldung/designpatterns/dtopattern/api/UserControllerIntegrationTest.java
new file mode 100644
index 0000000000..2cb351ffd1
--- /dev/null
+++ b/design-patterns/dto-pattern/src/test/java/com/baeldung/designpatterns/dtopattern/api/UserControllerIntegrationTest.java
@@ -0,0 +1,80 @@
+package com.baeldung.designpatterns.dtopattern.api;
+
+import com.baeldung.designpatterns.dtopattern.domain.Role;
+import com.baeldung.designpatterns.dtopattern.domain.RoleRepository;
+import com.baeldung.designpatterns.dtopattern.domain.User;
+import com.baeldung.designpatterns.dtopattern.domain.UserRepository;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import io.restassured.http.ContentType;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.test.web.client.TestRestTemplate;
+import org.springframework.boot.web.server.LocalServerPort;
+
+import java.util.Collections;
+
+import static io.restassured.RestAssured.given;
+import static org.hamcrest.CoreMatchers.*;
+import static org.springframework.http.HttpStatus.OK;
+
+@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+class UserControllerIntegrationTest {
+
+ @Autowired
+ private TestRestTemplate restTemplate;
+
+ @Autowired
+ private UserRepository userRepository;
+
+ @Autowired
+ private RoleRepository roleRepository;
+
+ @LocalServerPort
+ int port;
+
+ @Autowired
+ private ObjectMapper objectMapper;
+
+ @Test
+ void create_shouldReturnUseId() throws Exception {
+ UserCreationDTO request = new UserCreationDTO();
+ request.setName("User 1");
+ request.setPassword("Test@123456");
+ request.setRoles(Collections.singletonList("admin"));
+
+ given()
+ .contentType(ContentType.JSON)
+ .body(objectMapper.writeValueAsString(request))
+ .when()
+ .port(port)
+ .post("/users")
+ .then()
+ .statusCode(OK.value())
+ .body("id", notNullValue());
+ }
+
+ @Test
+ void getAll_shouldReturnUseDTO() {
+
+ userRepository.deleteAll();
+
+ String roleName = "admin";
+ Role admin = new Role(roleName);
+ roleRepository.save(admin);
+
+ String name = "User 1";
+ User user = new User(name, "Test@123456", Collections.singletonList(admin));
+ userRepository.save(user);
+
+ given()
+ .port(port)
+ .when()
+ .get("/users")
+ .then()
+ .statusCode(OK.value())
+ .body("size()", is(1))
+ .body("[0].name", equalTo(name))
+ .body("[0].roles", hasItem(roleName));
+ }
+}
diff --git a/design-patterns/dto-pattern/src/test/java/com/baeldung/designpatterns/dtopattern/domain/InMemoryRepositoryUnitTest.java b/design-patterns/dto-pattern/src/test/java/com/baeldung/designpatterns/dtopattern/domain/InMemoryRepositoryUnitTest.java
new file mode 100644
index 0000000000..cc16005f01
--- /dev/null
+++ b/design-patterns/dto-pattern/src/test/java/com/baeldung/designpatterns/dtopattern/domain/InMemoryRepositoryUnitTest.java
@@ -0,0 +1,83 @@
+package com.baeldung.designpatterns.dtopattern.domain;
+
+import org.junit.jupiter.api.Test;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+class InMemoryRepositoryUnitTest {
+
+ @Test
+ void getAll_shouldReturnAllUsers() {
+
+ String name = "Test";
+ String password = "test123";
+ List roles = new ArrayList<>();
+
+ User user = new User(name, password, roles);
+ List expectedUsers = Collections.singletonList(user);
+
+ InMemoryRepository repository = new InMemoryRepository();
+ repository.save(user);
+
+ List users = repository.getAll();
+
+ assertEquals(expectedUsers, users);
+ }
+
+ @Test
+ void save_whenSavingUser_shouldSetId() {
+ String name = "Test";
+ String password = "test123";
+ List roles = new ArrayList<>();
+
+ User user = new User(name, password, roles);
+
+ InMemoryRepository repository = new InMemoryRepository();
+ repository.save(user);
+
+ assertNotNull(user.getId());
+ }
+
+ @Test
+ void save_whenSavingRole_shouldSetId() {
+ String name = "Test";
+ Role role = new Role(name);
+
+ InMemoryRepository repository = new InMemoryRepository();
+ repository.save(role);
+
+ assertNotNull(role.getId());
+ }
+
+ @Test
+ void getRoleById_shouldReturnRoleById() {
+ String name = "Test";
+ Role expectedRole = new Role(name);
+
+ InMemoryRepository repository = new InMemoryRepository();
+ repository.save(expectedRole);
+
+ Role role = repository.getRoleById(expectedRole.getId());
+
+ assertEquals(expectedRole, role);
+ }
+
+ @Test
+ void getRoleByName_shouldReturnRoleByName() {
+ String name = "Test";
+ Role expectedRole = new Role(name);
+
+ InMemoryRepository repository = new InMemoryRepository();
+ repository.save(expectedRole);
+
+ Role role = repository.getRoleByName(name);
+
+ assertEquals(expectedRole, role);
+ }
+
+}
\ No newline at end of file
diff --git a/design-patterns/dto-pattern/src/test/java/com/baeldung/designpatterns/dtopattern/domain/UserUnitTest.java b/design-patterns/dto-pattern/src/test/java/com/baeldung/designpatterns/dtopattern/domain/UserUnitTest.java
new file mode 100644
index 0000000000..0af2c37cb5
--- /dev/null
+++ b/design-patterns/dto-pattern/src/test/java/com/baeldung/designpatterns/dtopattern/domain/UserUnitTest.java
@@ -0,0 +1,38 @@
+package com.baeldung.designpatterns.dtopattern.domain;
+
+import org.junit.jupiter.api.Test;
+
+import java.util.ArrayList;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+class UserUnitTest {
+
+
+ @Test
+ void whenUserIsCreated_shouldEncryptPassword() {
+ User user = new User("Test", "test", new ArrayList<>());
+
+ assertEquals(user.encrypt("test"), user.getPassword());
+ assertNotEquals(user.encrypt("Test"), user.getPassword());
+ }
+
+ @Test
+ void whenUserIsCreated_shouldFailIfNameIsNull() {
+ assertThrows(NullPointerException.class, () ->
+ new User(null, "test", new ArrayList<>()));
+ }
+
+ @Test
+ void whenUserIsCreated_shouldFailIfPasswordIsNull() {
+ assertThrows(NullPointerException.class, () ->
+ new User("Test", null, new ArrayList<>()));
+ }
+
+ @Test
+ void whenUserIsCreated_shouldFailIfRolesIsNull() {
+ assertThrows(NullPointerException.class, () ->
+ new User("Test", "Test", null));
+ }
+
+}
diff --git a/design-patterns/pom.xml b/design-patterns/pom.xml
new file mode 100644
index 0000000000..5fc0e95b2b
--- /dev/null
+++ b/design-patterns/pom.xml
@@ -0,0 +1,22 @@
+
+
+ 4.0.0
+ com.baeldung.designpatterns
+ design-patterns
+ 1.0.0-SNAPSHOT
+ design-patterns
+ pom
+
+
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+
+
+
+ dto-pattern
+
+
+
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 059c6dae25..b82a044893 100644
--- a/pom.xml
+++ b/pom.xml
@@ -387,6 +387,7 @@
core-groovy-strings
core-java-modules
+ design-patterns
couchbase
custom-pmd