From 74f800c3d90f852943b036ede6cc6b1cb014ff33 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=D0=B0=D0=B0=D0=B0?= <аа@d.d>
Date: Sun, 21 Jan 2024 00:29:04 +0400
Subject: [PATCH 01/14] Fixed task description
---
.../com/walking/lesson125_unit_testing/Main.java | 13 +++----------
1 file changed, 3 insertions(+), 10 deletions(-)
diff --git a/src/main/java/com/walking/lesson125_unit_testing/Main.java b/src/main/java/com/walking/lesson125_unit_testing/Main.java
index 94c12a6..e7b9b6b 100644
--- a/src/main/java/com/walking/lesson125_unit_testing/Main.java
+++ b/src/main/java/com/walking/lesson125_unit_testing/Main.java
@@ -5,16 +5,9 @@
import com.walking.lesson125_unit_testing.model.FullName;
/**
- * Реализуйте метод для работы с ФИО.
- * Входным параметром должна являться строка,
- * содержащая русскоязычное ФИО.
- * Фамилия, имя и отчество должны начинаться с прописной буквы
- * и быть разделены пробелами.
- * Фамилия может быть двойной и писаться через дефис
- * (каждая часть фамилии начинается с прописной буквы).
- * Если строка валидна – верните ФИО, обернутое в класс «Полное имя»,
- * содержащий фамилию, имя и отчество.
- * Если невалидна – бросьте из метода исключение, указывающее на ошибку валидации.
+ * На базе представленного решения
+ * задачи 2 урока 30
+ * произведите декомпозицию решения с учетом объектной модели и покройте получившееся решение юнит-тестами.
*/
public class Main {
From 14ac90a9bcfad645687a9c34efcb2fdd7486647d Mon Sep 17 00:00:00 2001
From: Binary-Cat-01
Date: Tue, 11 Feb 2025 19:42:12 +0300
Subject: [PATCH 02/14] Make object decomposition
---
.../walking/lesson125_unit_testing/Main.java | 64 ++-----------------
.../service/FullNameParsingService.java | 31 +++++++++
.../service/FullNameValidationService.java | 41 ++++++++++++
3 files changed, 77 insertions(+), 59 deletions(-)
create mode 100644 src/main/java/com/walking/lesson125_unit_testing/service/FullNameParsingService.java
create mode 100644 src/main/java/com/walking/lesson125_unit_testing/service/FullNameValidationService.java
diff --git a/src/main/java/com/walking/lesson125_unit_testing/Main.java b/src/main/java/com/walking/lesson125_unit_testing/Main.java
index e7b9b6b..aa4e319 100644
--- a/src/main/java/com/walking/lesson125_unit_testing/Main.java
+++ b/src/main/java/com/walking/lesson125_unit_testing/Main.java
@@ -1,9 +1,5 @@
package com.walking.lesson125_unit_testing;
-
-import com.walking.lesson125_unit_testing.exception.RegexValidationException;
-import com.walking.lesson125_unit_testing.model.FullName;
-
/**
* На базе представленного решения
* задачи 2 урока 30
@@ -11,66 +7,16 @@
*/
public class Main {
- public static final String FULL_NAME_REGEX = "^[А-Я][А-Яа-я-]* [А-Я][а-я]* [А-Я][а-я]+$";
- public static final String DOUBLE_SURNAME_REGEX = "[А-Я][а-я]*-[А-Я][а-я]*";
- public static final String NAME_REGEX = "[А-Я][а-я]*";
- public static final String PATRONYMIC_REGEX = "[А-Я][а-я]+";
-
public static void main(String[] args) {
- System.out.println(parseName("Иванов Иван Иванович"));
- System.out.println(parseName("Иванов-Иванов Иван Иванович"));
- System.out.println(parseName("Иванов-Иванов И Иванович"));
- System.out.println(parseName("И-Иванов И Иванович"));
- System.out.println(parseName("Иванов иван Иванович"));
+// System.out.println(parseName("Иванов Иван Иванович"));
+// System.out.println(parseName("Иванов-Иванов Иван Иванович"));
+// System.out.println(parseName("Иванов-Иванов И Иванович"));
+// System.out.println(parseName("И-Иванов И Иванович"));
+// System.out.println(parseName("Иванов иван Иванович"));
// Все равно упадет на 30й строке.
// System.out.println(parseName("И-иванов И Иванович"));
// System.out.println(parseName("Иванов Иван иванович"));
// System.out.println(parseName("ИваНов Иван Иванович"));
// System.out.println(parseName("Ivanov Ivan"));
}
-
- private static FullName parseName(String nameString) {
- if (!nameString.matches(FULL_NAME_REGEX)) {
- throw new RegexValidationException(nameString, FULL_NAME_REGEX);
- }
-
- FullName fullName = new FullName();
- String[] splitNameString = nameString.split(" ");
-
- String surname = splitNameString[0];
- validateSurname(surname);
- fullName.setSurname(surname);
-
- String name = splitNameString[1];
- validateName(name);
- fullName.setName(name);
-
- String patronymic = splitNameString[2];
- validatePatronymic(patronymic);
- fullName.setPatronymic(patronymic);
-
- return fullName;
- }
-
- private static void validateSurname(String surname) {
- if (surname.contains("-")) {
- if (!surname.matches(DOUBLE_SURNAME_REGEX)) {
- throw new RegexValidationException(surname, DOUBLE_SURNAME_REGEX);
- }
- } else {
- validateName(surname);
- }
- }
-
- private static void validateName(String name) {
- if (!name.matches(NAME_REGEX)) {
- throw new RegexValidationException(name, NAME_REGEX);
- }
- }
-
- private static void validatePatronymic(String name) {
- if (!name.matches(PATRONYMIC_REGEX)) {
- throw new RegexValidationException(name, PATRONYMIC_REGEX);
- }
- }
}
diff --git a/src/main/java/com/walking/lesson125_unit_testing/service/FullNameParsingService.java b/src/main/java/com/walking/lesson125_unit_testing/service/FullNameParsingService.java
new file mode 100644
index 0000000..0e2b52a
--- /dev/null
+++ b/src/main/java/com/walking/lesson125_unit_testing/service/FullNameParsingService.java
@@ -0,0 +1,31 @@
+package com.walking.lesson125_unit_testing.service;
+
+import com.walking.lesson125_unit_testing.model.FullName;
+
+public class FullNameParsingService {
+ private final FullNameValidationService fullNameValidationService = new FullNameValidationService();
+
+ public FullNameParsingService() {
+ }
+
+ private FullName parseName(String nameString) {
+ fullNameValidationService.validateFullName(nameString);
+
+ FullName fullName = new FullName();
+ String[] splitNameString = nameString.split(" ");
+
+ String surname = splitNameString[0];
+ fullNameValidationService.validateSurname(surname);
+ fullName.setSurname(surname);
+
+ String name = splitNameString[1];
+ fullNameValidationService.validateName(name);
+ fullName.setName(name);
+
+ String patronymic = splitNameString[2];
+ fullNameValidationService.validatePatronymic(patronymic);
+ fullName.setPatronymic(patronymic);
+
+ return fullName;
+ }
+}
diff --git a/src/main/java/com/walking/lesson125_unit_testing/service/FullNameValidationService.java b/src/main/java/com/walking/lesson125_unit_testing/service/FullNameValidationService.java
new file mode 100644
index 0000000..3873a82
--- /dev/null
+++ b/src/main/java/com/walking/lesson125_unit_testing/service/FullNameValidationService.java
@@ -0,0 +1,41 @@
+package com.walking.lesson125_unit_testing.service;
+
+import com.walking.lesson125_unit_testing.exception.RegexValidationException;
+
+public class FullNameValidationService {
+ public static final String FULL_NAME_REGEX = "^[А-Я][А-Яа-я-]* [А-Я][а-я]* [А-Я][а-я]+$";
+ public static final String DOUBLE_SURNAME_REGEX = "[А-Я][а-я]*-[А-Я][а-я]*";
+ public static final String NAME_REGEX = "[А-Я][а-я]*";
+ public static final String PATRONYMIC_REGEX = "[А-Я][а-я]+";
+
+ public FullNameValidationService() {
+ }
+
+ public void validateFullName(String nameString) {
+ if (!nameString.matches(FULL_NAME_REGEX)) {
+ throw new RegexValidationException(nameString, FULL_NAME_REGEX);
+ }
+ }
+
+ public void validateSurname(String surname) {
+ if (surname.contains("-")) {
+ if (!surname.matches(DOUBLE_SURNAME_REGEX)) {
+ throw new RegexValidationException(surname, DOUBLE_SURNAME_REGEX);
+ }
+ } else {
+ validateName(surname);
+ }
+ }
+
+ public void validateName(String name) {
+ if (!name.matches(NAME_REGEX)) {
+ throw new RegexValidationException(name, NAME_REGEX);
+ }
+ }
+
+ public void validatePatronymic(String name) {
+ if (!name.matches(PATRONYMIC_REGEX)) {
+ throw new RegexValidationException(name, PATRONYMIC_REGEX);
+ }
+ }
+}
From b6071513d6bd501eb1a08aaae7f1fd21bb4e6d20 Mon Sep 17 00:00:00 2001
From: Binary-Cat-01
Date: Tue, 11 Feb 2025 19:55:54 +0300
Subject: [PATCH 03/14] Add dependencies: junit
---
build.gradle | 2 ++
1 file changed, 2 insertions(+)
diff --git a/build.gradle b/build.gradle
index 3e77eaa..d1ab1ee 100644
--- a/build.gradle
+++ b/build.gradle
@@ -10,6 +10,8 @@ repositories {
}
dependencies {
+ testImplementation('org.junit.jupiter:junit-jupiter-api:5.8.1')
+ testRuntimeOnly('org.junit.jupiter:junit-jupiter-engine:5.8.1')
}
test {
From c4976ffd3f5f8504c768043bdbb15ee2aed37acd Mon Sep 17 00:00:00 2001
From: Binary-Cat-01
Date: Wed, 12 Feb 2025 21:08:26 +0300
Subject: [PATCH 04/14] Fixed Gradle UTF-8 problem
---
build.gradle | 12 ++++++++++--
gradle/wrapper/gradle-wrapper.properties | 3 ++-
settings.gradle | 1 +
3 files changed, 13 insertions(+), 3 deletions(-)
diff --git a/build.gradle b/build.gradle
index d1ab1ee..065e409 100644
--- a/build.gradle
+++ b/build.gradle
@@ -10,10 +10,18 @@ repositories {
}
dependencies {
- testImplementation('org.junit.jupiter:junit-jupiter-api:5.8.1')
- testRuntimeOnly('org.junit.jupiter:junit-jupiter-engine:5.8.1')
+ testImplementation 'org.junit.jupiter:junit-jupiter-api:5.11.4'
+ testImplementation 'org.junit.jupiter:junit-jupiter-params:5.11.4'
+ testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.11.4'
}
test {
+ systemProperty "file.encoding", "utf-8"
useJUnitPlatform()
+}
+
+compileJava.options.encoding = 'UTF-8'
+
+tasks.withType(JavaCompile) {
+ options.encoding = 'UTF-8'
}
\ No newline at end of file
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 41dfb87..b6dbf84 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,5 +1,6 @@
+#Tue Feb 11 23:22:06 MSK 2025
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
diff --git a/settings.gradle b/settings.gradle
index 96fd2ac..5c8e1d9 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -1,2 +1,3 @@
rootProject.name = 'unit-testing-practical-task'
+
From cc532413333508e33083460b2c2458220b29014d Mon Sep 17 00:00:00 2001
From: Binary-Cat-01
Date: Fri, 14 Feb 2025 16:49:15 +0300
Subject: [PATCH 05/14] Refactored
---
.../walking/lesson125_unit_testing/Main.java | 15 ++++--------
.../model/FullName.java | 24 +++++++++++++++++++
.../service/FullNameParsingService.java | 13 ++++------
3 files changed, 34 insertions(+), 18 deletions(-)
diff --git a/src/main/java/com/walking/lesson125_unit_testing/Main.java b/src/main/java/com/walking/lesson125_unit_testing/Main.java
index aa4e319..31a543d 100644
--- a/src/main/java/com/walking/lesson125_unit_testing/Main.java
+++ b/src/main/java/com/walking/lesson125_unit_testing/Main.java
@@ -1,5 +1,7 @@
package com.walking.lesson125_unit_testing;
+import com.walking.lesson125_unit_testing.service.FullNameValidationService;
+
/**
* На базе представленного решения
* задачи 2 урока 30
@@ -8,15 +10,8 @@
public class Main {
public static void main(String[] args) {
-// System.out.println(parseName("Иванов Иван Иванович"));
-// System.out.println(parseName("Иванов-Иванов Иван Иванович"));
-// System.out.println(parseName("Иванов-Иванов И Иванович"));
-// System.out.println(parseName("И-Иванов И Иванович"));
-// System.out.println(parseName("Иванов иван Иванович"));
-// Все равно упадет на 30й строке.
-// System.out.println(parseName("И-иванов И Иванович"));
-// System.out.println(parseName("Иванов Иван иванович"));
-// System.out.println(parseName("ИваНов Иван Иванович"));
-// System.out.println(parseName("Ivanov Ivan"));
+ FullNameValidationService fullNameValidationService = new FullNameValidationService();
+
+ fullNameValidationService.validateFullName(null);
}
}
diff --git a/src/main/java/com/walking/lesson125_unit_testing/model/FullName.java b/src/main/java/com/walking/lesson125_unit_testing/model/FullName.java
index 86c5f1c..1ce7735 100644
--- a/src/main/java/com/walking/lesson125_unit_testing/model/FullName.java
+++ b/src/main/java/com/walking/lesson125_unit_testing/model/FullName.java
@@ -1,5 +1,7 @@
package com.walking.lesson125_unit_testing.model;
+import java.util.Objects;
+
public class FullName {
private String name;
private String surname;
@@ -42,4 +44,26 @@ public void setPatronymic(String patronymic) {
public String toString() {
return "%s %s %s".formatted(surname, name, patronymic);
}
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+
+ FullName fullName = (FullName) o;
+ return Objects.equals(name, fullName.name) && Objects.equals(surname, fullName.surname) && Objects.equals(
+ patronymic, fullName.patronymic);
+ }
+
+ @Override
+ public int hashCode() {
+ int result = Objects.hashCode(name);
+ result = 31 * result + Objects.hashCode(surname);
+ result = 31 * result + Objects.hashCode(patronymic);
+ return result;
+ }
}
diff --git a/src/main/java/com/walking/lesson125_unit_testing/service/FullNameParsingService.java b/src/main/java/com/walking/lesson125_unit_testing/service/FullNameParsingService.java
index 0e2b52a..0d4895a 100644
--- a/src/main/java/com/walking/lesson125_unit_testing/service/FullNameParsingService.java
+++ b/src/main/java/com/walking/lesson125_unit_testing/service/FullNameParsingService.java
@@ -3,29 +3,26 @@
import com.walking.lesson125_unit_testing.model.FullName;
public class FullNameParsingService {
- private final FullNameValidationService fullNameValidationService = new FullNameValidationService();
+ private final FullNameValidationService fullNameValidationService;
- public FullNameParsingService() {
+ public FullNameParsingService(FullNameValidationService fullNameValidationService) {
+ this.fullNameValidationService = fullNameValidationService;
}
- private FullName parseName(String nameString) {
+ public FullName parseName(String nameString) {
fullNameValidationService.validateFullName(nameString);
- FullName fullName = new FullName();
String[] splitNameString = nameString.split(" ");
String surname = splitNameString[0];
fullNameValidationService.validateSurname(surname);
- fullName.setSurname(surname);
String name = splitNameString[1];
fullNameValidationService.validateName(name);
- fullName.setName(name);
String patronymic = splitNameString[2];
fullNameValidationService.validatePatronymic(patronymic);
- fullName.setPatronymic(patronymic);
- return fullName;
+ return new FullName(name, surname, patronymic);
}
}
From bb7b6511faf583edea60b56c650132e7b5be7b1d Mon Sep 17 00:00:00 2001
From: Binary-Cat-01
Date: Fri, 14 Feb 2025 16:50:03 +0300
Subject: [PATCH 06/14] Added unit-test
---
.../service/FullNameParsingServiceTest.java | 32 ++++
.../FullNameValidationServiceTest.java | 137 ++++++++++++++++++
2 files changed, 169 insertions(+)
create mode 100644 src/test/java/com/walking/lesson125_unit_testing/service/FullNameParsingServiceTest.java
create mode 100644 src/test/java/com/walking/lesson125_unit_testing/service/FullNameValidationServiceTest.java
diff --git a/src/test/java/com/walking/lesson125_unit_testing/service/FullNameParsingServiceTest.java b/src/test/java/com/walking/lesson125_unit_testing/service/FullNameParsingServiceTest.java
new file mode 100644
index 0000000..551cd85
--- /dev/null
+++ b/src/test/java/com/walking/lesson125_unit_testing/service/FullNameParsingServiceTest.java
@@ -0,0 +1,32 @@
+package com.walking.lesson125_unit_testing.service;
+
+import com.walking.lesson125_unit_testing.model.FullName;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+class FullNameParsingServiceTest {
+ private FullNameParsingService fullNameParsingService;
+ static private FullNameValidationService fullNameValidationService;
+
+ @BeforeAll
+ static void beforeAll() {
+ fullNameValidationService = new FullNameValidationService();
+ }
+
+ @BeforeEach
+ void setUp() {
+ fullNameParsingService = new FullNameParsingService(fullNameValidationService);
+ }
+
+ @Test
+ void parse_success() {
+// when
+ String nameString = "Иванов Иван Иванович";
+ FullName testFullName = new FullName("Иван", "Иванов", "Иванович");
+// then
+ assertEquals(testFullName, fullNameParsingService.parseName(nameString));
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/com/walking/lesson125_unit_testing/service/FullNameValidationServiceTest.java b/src/test/java/com/walking/lesson125_unit_testing/service/FullNameValidationServiceTest.java
new file mode 100644
index 0000000..dadedfb
--- /dev/null
+++ b/src/test/java/com/walking/lesson125_unit_testing/service/FullNameValidationServiceTest.java
@@ -0,0 +1,137 @@
+package com.walking.lesson125_unit_testing.service;
+
+import com.walking.lesson125_unit_testing.exception.RegexValidationException;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.function.Executable;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.EmptySource;
+import org.junit.jupiter.params.provider.FieldSource;
+
+import java.util.List;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+class FullNameValidationServiceTest {
+ private FullNameValidationService fullNameValidationService;
+
+ private static final List INVALID_FULL_NAMES = List.of(
+ "иванов Иван Иванович",
+ "Иванов иван Иванович",
+ "Иванов Иван иванович",
+ "Иванов Иван",
+ "Ivanov Ivan");
+
+ private static final List VALID_FULL_NAMES = List.of(
+ "Иванов Иван Иванович",
+ "Иванов-Иванов Иван Иванович",
+ "Иванов-Иванов И Иванович",
+ "И-Иванов И Иванович");
+
+ private static final List INVALID_NAMES = List.of(
+ "иван",
+ "Ivan",
+ "Иван-иван");
+
+ private static final List VALID_NAMES = List.of(
+ "Иван");
+
+ private static final List INVALID_DOUBLE_SURNAMES = List.of(
+ "И-иванов",
+ "иванов-И",
+ "Иванов-И-Иванов",
+ "Ivanov-I");
+
+ private static final List VALID_DOUBLE_SURNAMES = List.of(
+ "Иванов-Иванов",
+ "И-Иванов");
+
+ private static final List INVALID_PATRONYMICS = List.of(
+ "иванович",
+ "Ivanovich",
+ "И",
+ "Иванович-Степанович");
+
+ private static final List VALID_PATRONYMICS = List.of(
+ "Иванович");
+
+ @BeforeEach
+ void setUp() {
+ fullNameValidationService = new FullNameValidationService();
+ }
+
+ @ParameterizedTest
+ @EmptySource
+ @FieldSource("INVALID_FULL_NAMES")
+ void validateFullName_invalidFullNames_ThrowsException(String invalidFullName) {
+ // when
+ Executable actual = () -> fullNameValidationService.validateFullName(invalidFullName);
+ // then
+ Throwable throwable = assertThrows(RegexValidationException.class, actual);
+ }
+
+ @ParameterizedTest
+ @FieldSource("VALID_FULL_NAMES")
+ void validateFullName_validFullNames_DoesNotThrowException(String validFullName) {
+ // when
+ Executable actual = () -> fullNameValidationService.validateFullName(validFullName);
+ // then
+ assertDoesNotThrow(actual);
+ }
+
+ @ParameterizedTest
+ @EmptySource
+ @FieldSource("INVALID_NAMES")
+ void validateName_invalidName_ThrowsException(String invalidName) {
+ // when
+ Executable actual = () -> fullNameValidationService.validateName(invalidName);
+ // then
+ Throwable throwable = assertThrows(RegexValidationException.class, actual);
+ }
+
+ @ParameterizedTest
+ @FieldSource("VALID_NAMES")
+ void validateName_validNames_DoesNotThrowException(String validName) {
+ // when
+ Executable actual = () -> fullNameValidationService.validateName(validName);
+ // then
+ assertDoesNotThrow(actual);
+ }
+
+ @ParameterizedTest
+ @EmptySource
+ @FieldSource("INVALID_DOUBLE_SURNAMES")
+ void validateSurname_invalidSurNames_ThrowsException(String invalidSurName) {
+ // when
+ Executable actual = () -> fullNameValidationService.validateSurname(invalidSurName);
+ // then
+ Throwable throwable = assertThrows(RegexValidationException.class, actual);
+ }
+
+ @ParameterizedTest
+ @FieldSource("VALID_DOUBLE_SURNAMES")
+ void validateSurName_validSurNames_DoesNotThrowException(String validSurName) {
+ // when
+ Executable actual = () -> fullNameValidationService.validateSurname(validSurName);
+ // then
+ assertDoesNotThrow(actual);
+ }
+
+ @ParameterizedTest
+ @EmptySource
+ @FieldSource("INVALID_PATRONYMICS")
+ void validatePatronymic_invalidPatronymics_ThrowsException(String invalidPatronymic) {
+ // when
+ Executable actual = () -> fullNameValidationService.validatePatronymic(invalidPatronymic);
+ // then
+ Throwable throwable = assertThrows(RegexValidationException.class, actual);
+ }
+
+ @ParameterizedTest
+ @FieldSource("VALID_PATRONYMICS")
+ void validatePatronymic_validPatronymics_DoesNotThrowException(String validPatronymic) {
+ // when
+ Executable actual = () -> fullNameValidationService.validatePatronymic(validPatronymic);
+ // then
+ assertDoesNotThrow(actual);
+ }
+}
\ No newline at end of file
From b7321956a892d3f75e60e4bcb4041b4e06db3bb1 Mon Sep 17 00:00:00 2001
From: Binary-Cat-01
Date: Fri, 14 Feb 2025 17:09:51 +0300
Subject: [PATCH 07/14] Fixed minor
---
src/main/java/com/walking/lesson125_unit_testing/Main.java | 6 ------
.../service/FullNameParsingService.java | 2 +-
.../service/FullNameParsingServiceTest.java | 2 +-
3 files changed, 2 insertions(+), 8 deletions(-)
diff --git a/src/main/java/com/walking/lesson125_unit_testing/Main.java b/src/main/java/com/walking/lesson125_unit_testing/Main.java
index 31a543d..d3daaae 100644
--- a/src/main/java/com/walking/lesson125_unit_testing/Main.java
+++ b/src/main/java/com/walking/lesson125_unit_testing/Main.java
@@ -1,17 +1,11 @@
package com.walking.lesson125_unit_testing;
-import com.walking.lesson125_unit_testing.service.FullNameValidationService;
-
/**
* На базе представленного решения
* задачи 2 урока 30
* произведите декомпозицию решения с учетом объектной модели и покройте получившееся решение юнит-тестами.
*/
public class Main {
-
public static void main(String[] args) {
- FullNameValidationService fullNameValidationService = new FullNameValidationService();
-
- fullNameValidationService.validateFullName(null);
}
}
diff --git a/src/main/java/com/walking/lesson125_unit_testing/service/FullNameParsingService.java b/src/main/java/com/walking/lesson125_unit_testing/service/FullNameParsingService.java
index 0d4895a..69f16f2 100644
--- a/src/main/java/com/walking/lesson125_unit_testing/service/FullNameParsingService.java
+++ b/src/main/java/com/walking/lesson125_unit_testing/service/FullNameParsingService.java
@@ -9,7 +9,7 @@ public FullNameParsingService(FullNameValidationService fullNameValidationServic
this.fullNameValidationService = fullNameValidationService;
}
- public FullName parseName(String nameString) {
+ public FullName parseFullName(String nameString) {
fullNameValidationService.validateFullName(nameString);
String[] splitNameString = nameString.split(" ");
diff --git a/src/test/java/com/walking/lesson125_unit_testing/service/FullNameParsingServiceTest.java b/src/test/java/com/walking/lesson125_unit_testing/service/FullNameParsingServiceTest.java
index 551cd85..defe349 100644
--- a/src/test/java/com/walking/lesson125_unit_testing/service/FullNameParsingServiceTest.java
+++ b/src/test/java/com/walking/lesson125_unit_testing/service/FullNameParsingServiceTest.java
@@ -27,6 +27,6 @@ void parse_success() {
String nameString = "Иванов Иван Иванович";
FullName testFullName = new FullName("Иван", "Иванов", "Иванович");
// then
- assertEquals(testFullName, fullNameParsingService.parseName(nameString));
+ assertEquals(testFullName, fullNameParsingService.parseFullName(nameString));
}
}
\ No newline at end of file
From f435117cb64ba95dc1a32be73c613aeacee14c79 Mon Sep 17 00:00:00 2001
From: Binary-Cat-01
Date: Mon, 17 Feb 2025 17:21:01 +0300
Subject: [PATCH 08/14] Fixed test
---
.../service/FullNameParsingServiceTest.java | 8 ++--
.../FullNameValidationServiceTest.java | 40 +++++++++----------
2 files changed, 25 insertions(+), 23 deletions(-)
diff --git a/src/test/java/com/walking/lesson125_unit_testing/service/FullNameParsingServiceTest.java b/src/test/java/com/walking/lesson125_unit_testing/service/FullNameParsingServiceTest.java
index defe349..0874c55 100644
--- a/src/test/java/com/walking/lesson125_unit_testing/service/FullNameParsingServiceTest.java
+++ b/src/test/java/com/walking/lesson125_unit_testing/service/FullNameParsingServiceTest.java
@@ -23,10 +23,12 @@ void setUp() {
@Test
void parse_success() {
+// given
+ String testFullNameString = "Иванов Иван Иванович";
+ FullName validFullName = new FullName("Иван", "Иванов", "Иванович");
// when
- String nameString = "Иванов Иван Иванович";
- FullName testFullName = new FullName("Иван", "Иванов", "Иванович");
+ FullName parsedFullName = fullNameParsingService.parseFullName(testFullNameString);
// then
- assertEquals(testFullName, fullNameParsingService.parseFullName(nameString));
+ assertEquals(validFullName, parsedFullName);
}
}
\ No newline at end of file
diff --git a/src/test/java/com/walking/lesson125_unit_testing/service/FullNameValidationServiceTest.java b/src/test/java/com/walking/lesson125_unit_testing/service/FullNameValidationServiceTest.java
index dadedfb..cfae87d 100644
--- a/src/test/java/com/walking/lesson125_unit_testing/service/FullNameValidationServiceTest.java
+++ b/src/test/java/com/walking/lesson125_unit_testing/service/FullNameValidationServiceTest.java
@@ -63,18 +63,18 @@ void setUp() {
@EmptySource
@FieldSource("INVALID_FULL_NAMES")
void validateFullName_invalidFullNames_ThrowsException(String invalidFullName) {
- // when
+// when
Executable actual = () -> fullNameValidationService.validateFullName(invalidFullName);
- // then
- Throwable throwable = assertThrows(RegexValidationException.class, actual);
+// then
+ assertThrows(RegexValidationException.class, actual);
}
@ParameterizedTest
@FieldSource("VALID_FULL_NAMES")
void validateFullName_validFullNames_DoesNotThrowException(String validFullName) {
- // when
+// when
Executable actual = () -> fullNameValidationService.validateFullName(validFullName);
- // then
+// then
assertDoesNotThrow(actual);
}
@@ -82,18 +82,18 @@ void validateFullName_validFullNames_DoesNotThrowException(String validFullName)
@EmptySource
@FieldSource("INVALID_NAMES")
void validateName_invalidName_ThrowsException(String invalidName) {
- // when
+// when
Executable actual = () -> fullNameValidationService.validateName(invalidName);
- // then
- Throwable throwable = assertThrows(RegexValidationException.class, actual);
+// then
+ assertThrows(RegexValidationException.class, actual);
}
@ParameterizedTest
@FieldSource("VALID_NAMES")
void validateName_validNames_DoesNotThrowException(String validName) {
- // when
+// when
Executable actual = () -> fullNameValidationService.validateName(validName);
- // then
+// then
assertDoesNotThrow(actual);
}
@@ -101,18 +101,18 @@ void validateName_validNames_DoesNotThrowException(String validName) {
@EmptySource
@FieldSource("INVALID_DOUBLE_SURNAMES")
void validateSurname_invalidSurNames_ThrowsException(String invalidSurName) {
- // when
+// when
Executable actual = () -> fullNameValidationService.validateSurname(invalidSurName);
- // then
- Throwable throwable = assertThrows(RegexValidationException.class, actual);
+// then
+ assertThrows(RegexValidationException.class, actual);
}
@ParameterizedTest
@FieldSource("VALID_DOUBLE_SURNAMES")
void validateSurName_validSurNames_DoesNotThrowException(String validSurName) {
- // when
+// when
Executable actual = () -> fullNameValidationService.validateSurname(validSurName);
- // then
+// then
assertDoesNotThrow(actual);
}
@@ -120,18 +120,18 @@ void validateSurName_validSurNames_DoesNotThrowException(String validSurName) {
@EmptySource
@FieldSource("INVALID_PATRONYMICS")
void validatePatronymic_invalidPatronymics_ThrowsException(String invalidPatronymic) {
- // when
+// when
Executable actual = () -> fullNameValidationService.validatePatronymic(invalidPatronymic);
- // then
- Throwable throwable = assertThrows(RegexValidationException.class, actual);
+// then
+ assertThrows(RegexValidationException.class, actual);
}
@ParameterizedTest
@FieldSource("VALID_PATRONYMICS")
void validatePatronymic_validPatronymics_DoesNotThrowException(String validPatronymic) {
- // when
+// when
Executable actual = () -> fullNameValidationService.validatePatronymic(validPatronymic);
- // then
+// then
assertDoesNotThrow(actual);
}
}
\ No newline at end of file
From b8ded7ffdb97aa89d4759457791783fe58218560 Mon Sep 17 00:00:00 2001
From: Binary-Cat-01
Date: Mon, 17 Feb 2025 22:08:45 +0300
Subject: [PATCH 09/14] build: add mockito-core dependency
---
build.gradle | 1 +
1 file changed, 1 insertion(+)
diff --git a/build.gradle b/build.gradle
index 065e409..a6ccaeb 100644
--- a/build.gradle
+++ b/build.gradle
@@ -10,6 +10,7 @@ repositories {
}
dependencies {
+ testImplementation 'org.mockito:mockito-core:5.14.2'
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.11.4'
testImplementation 'org.junit.jupiter:junit-jupiter-params:5.11.4'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.11.4'
From 64b9d805dcc6c3359bdde569920ae4f3672ff29f Mon Sep 17 00:00:00 2001
From: Binary-Cat-01
Date: Mon, 17 Feb 2025 23:37:29 +0300
Subject: [PATCH 10/14] test: refactor fullNameParsingServiceTest with Mockito
---
.../service/FullNameParsingServiceTest.java | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/src/test/java/com/walking/lesson125_unit_testing/service/FullNameParsingServiceTest.java b/src/test/java/com/walking/lesson125_unit_testing/service/FullNameParsingServiceTest.java
index 0874c55..0ed04a0 100644
--- a/src/test/java/com/walking/lesson125_unit_testing/service/FullNameParsingServiceTest.java
+++ b/src/test/java/com/walking/lesson125_unit_testing/service/FullNameParsingServiceTest.java
@@ -4,6 +4,7 @@
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
+import org.mockito.Mockito;
import static org.junit.jupiter.api.Assertions.*;
@@ -13,7 +14,7 @@ class FullNameParsingServiceTest {
@BeforeAll
static void beforeAll() {
- fullNameValidationService = new FullNameValidationService();
+ fullNameValidationService = Mockito.mock(FullNameValidationService.class);
}
@BeforeEach
@@ -24,6 +25,11 @@ void setUp() {
@Test
void parse_success() {
// given
+ Mockito.doNothing().when(fullNameValidationService).validateFullName(Mockito.any());
+ Mockito.doNothing().when(fullNameValidationService).validateName(Mockito.any());
+ Mockito.doNothing().when(fullNameValidationService).validateSurname(Mockito.any());
+ Mockito.doNothing().when(fullNameValidationService).validatePatronymic(Mockito.any());
+
String testFullNameString = "Иванов Иван Иванович";
FullName validFullName = new FullName("Иван", "Иванов", "Иванович");
// when
From b68f5606914e3f35ad0388bdb20faf7d64c979d3 Mon Sep 17 00:00:00 2001
From: Binary-Cat-01
Date: Mon, 17 Feb 2025 23:39:42 +0300
Subject: [PATCH 11/14] build: add mockito-junit dependency
---
build.gradle | 1 +
1 file changed, 1 insertion(+)
diff --git a/build.gradle b/build.gradle
index a6ccaeb..281eba4 100644
--- a/build.gradle
+++ b/build.gradle
@@ -11,6 +11,7 @@ repositories {
dependencies {
testImplementation 'org.mockito:mockito-core:5.14.2'
+ testImplementation 'org.mockito:mockito-junit-jupiter:5.14.2'
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.11.4'
testImplementation 'org.junit.jupiter:junit-jupiter-params:5.11.4'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.11.4'
From 724fc51e4d8fced11ab992d9b8f0914f5a3f36d5 Mon Sep 17 00:00:00 2001
From: Binary-Cat-01
Date: Mon, 17 Feb 2025 23:46:05 +0300
Subject: [PATCH 12/14] test: refactor fullNameParsingServiceTest with
MockitoExtension
---
.../service/FullNameParsingServiceTest.java | 18 ++++++++----------
1 file changed, 8 insertions(+), 10 deletions(-)
diff --git a/src/test/java/com/walking/lesson125_unit_testing/service/FullNameParsingServiceTest.java b/src/test/java/com/walking/lesson125_unit_testing/service/FullNameParsingServiceTest.java
index 0ed04a0..1fe6abf 100644
--- a/src/test/java/com/walking/lesson125_unit_testing/service/FullNameParsingServiceTest.java
+++ b/src/test/java/com/walking/lesson125_unit_testing/service/FullNameParsingServiceTest.java
@@ -4,23 +4,21 @@
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
import org.mockito.Mockito;
+import org.mockito.junit.jupiter.MockitoExtension;
import static org.junit.jupiter.api.Assertions.*;
+@ExtendWith(MockitoExtension.class)
class FullNameParsingServiceTest {
+ @InjectMocks
private FullNameParsingService fullNameParsingService;
- static private FullNameValidationService fullNameValidationService;
- @BeforeAll
- static void beforeAll() {
- fullNameValidationService = Mockito.mock(FullNameValidationService.class);
- }
-
- @BeforeEach
- void setUp() {
- fullNameParsingService = new FullNameParsingService(fullNameValidationService);
- }
+ @Mock
+ private FullNameValidationService fullNameValidationService;
@Test
void parse_success() {
From 78e5bedb71d44b81b0e45da98dd232625806c71c Mon Sep 17 00:00:00 2001
From: Binary-Cat-01
Date: Wed, 5 Mar 2025 20:22:20 +0300
Subject: [PATCH 13/14] test: add fail-case to fullNameParsingServiceTest
---
.../service/FullNameParsingService.java | 23 +++++++++++--------
.../service/FullNameParsingServiceTest.java | 21 ++++++++++++-----
.../FullNameValidationServiceTest.java | 1 +
3 files changed, 30 insertions(+), 15 deletions(-)
diff --git a/src/main/java/com/walking/lesson125_unit_testing/service/FullNameParsingService.java b/src/main/java/com/walking/lesson125_unit_testing/service/FullNameParsingService.java
index 69f16f2..864486b 100644
--- a/src/main/java/com/walking/lesson125_unit_testing/service/FullNameParsingService.java
+++ b/src/main/java/com/walking/lesson125_unit_testing/service/FullNameParsingService.java
@@ -1,5 +1,6 @@
package com.walking.lesson125_unit_testing.service;
+import com.walking.lesson125_unit_testing.exception.RegexValidationException;
import com.walking.lesson125_unit_testing.model.FullName;
public class FullNameParsingService {
@@ -10,19 +11,23 @@ public FullNameParsingService(FullNameValidationService fullNameValidationServic
}
public FullName parseFullName(String nameString) {
- fullNameValidationService.validateFullName(nameString);
+ try {
+ fullNameValidationService.validateFullName(nameString);
- String[] splitNameString = nameString.split(" ");
+ String[] splitNameString = nameString.split(" ");
- String surname = splitNameString[0];
- fullNameValidationService.validateSurname(surname);
+ String surname = splitNameString[0];
+ fullNameValidationService.validateSurname(surname);
- String name = splitNameString[1];
- fullNameValidationService.validateName(name);
+ String name = splitNameString[1];
+ fullNameValidationService.validateName(name);
- String patronymic = splitNameString[2];
- fullNameValidationService.validatePatronymic(patronymic);
+ String patronymic = splitNameString[2];
+ fullNameValidationService.validatePatronymic(patronymic);
- return new FullName(name, surname, patronymic);
+ return new FullName(name, surname, patronymic);
+ } catch (RegexValidationException e) {
+ throw new RuntimeException("Failed parsing fullName", e);
+ }
}
}
diff --git a/src/test/java/com/walking/lesson125_unit_testing/service/FullNameParsingServiceTest.java b/src/test/java/com/walking/lesson125_unit_testing/service/FullNameParsingServiceTest.java
index 1fe6abf..0e0f78e 100644
--- a/src/test/java/com/walking/lesson125_unit_testing/service/FullNameParsingServiceTest.java
+++ b/src/test/java/com/walking/lesson125_unit_testing/service/FullNameParsingServiceTest.java
@@ -1,10 +1,12 @@
package com.walking.lesson125_unit_testing.service;
+import com.walking.lesson125_unit_testing.exception.RegexValidationException;
import com.walking.lesson125_unit_testing.model.FullName;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
+import org.junit.jupiter.api.function.Executable;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
@@ -21,13 +23,8 @@ class FullNameParsingServiceTest {
private FullNameValidationService fullNameValidationService;
@Test
- void parse_success() {
+ void parseFullName_success() {
// given
- Mockito.doNothing().when(fullNameValidationService).validateFullName(Mockito.any());
- Mockito.doNothing().when(fullNameValidationService).validateName(Mockito.any());
- Mockito.doNothing().when(fullNameValidationService).validateSurname(Mockito.any());
- Mockito.doNothing().when(fullNameValidationService).validatePatronymic(Mockito.any());
-
String testFullNameString = "Иванов Иван Иванович";
FullName validFullName = new FullName("Иван", "Иванов", "Иванович");
// when
@@ -35,4 +32,16 @@ void parse_success() {
// then
assertEquals(validFullName, parsedFullName);
}
+
+ @Test
+ void parseFullName_fail() {
+ // given
+ Mockito.doThrow(RegexValidationException.class)
+ .when(fullNameValidationService)
+ .validateFullName(Mockito.anyString());
+ // when
+ Executable actual = () -> fullNameParsingService.parseFullName(Mockito.any());
+ // then
+ assertThrows(RuntimeException.class, actual);
+ }
}
\ No newline at end of file
diff --git a/src/test/java/com/walking/lesson125_unit_testing/service/FullNameValidationServiceTest.java b/src/test/java/com/walking/lesson125_unit_testing/service/FullNameValidationServiceTest.java
index cfae87d..d5fca20 100644
--- a/src/test/java/com/walking/lesson125_unit_testing/service/FullNameValidationServiceTest.java
+++ b/src/test/java/com/walking/lesson125_unit_testing/service/FullNameValidationServiceTest.java
@@ -6,6 +6,7 @@
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.EmptySource;
import org.junit.jupiter.params.provider.FieldSource;
+import org.junit.jupiter.params.provider.NullSource;
import java.util.List;
From 516bc6dea7b268d01997f9e731e65de2df2f4a02 Mon Sep 17 00:00:00 2001
From: Binary-Cat-01
Date: Thu, 13 Mar 2025 17:22:55 +0300
Subject: [PATCH 14/14] refactor: refactor after pr
---
build.gradle | 2 +-
settings.gradle | 1 -
.../model/FullName.java | 8 +-
.../service/FullNameParsingService.java | 27 ++-
.../service/FullNameValidationService.java | 11 +-
.../service/FullNameParsingServiceTest.java | 59 ++++--
.../FullNameValidationServiceTest.java | 178 ++++++++++--------
7 files changed, 169 insertions(+), 117 deletions(-)
diff --git a/build.gradle b/build.gradle
index 281eba4..ba5004f 100644
--- a/build.gradle
+++ b/build.gradle
@@ -26,4 +26,4 @@ compileJava.options.encoding = 'UTF-8'
tasks.withType(JavaCompile) {
options.encoding = 'UTF-8'
-}
\ No newline at end of file
+}
diff --git a/settings.gradle b/settings.gradle
index 5c8e1d9..96fd2ac 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -1,3 +1,2 @@
rootProject.name = 'unit-testing-practical-task'
-
diff --git a/src/main/java/com/walking/lesson125_unit_testing/model/FullName.java b/src/main/java/com/walking/lesson125_unit_testing/model/FullName.java
index 1ce7735..65bc32b 100644
--- a/src/main/java/com/walking/lesson125_unit_testing/model/FullName.java
+++ b/src/main/java/com/walking/lesson125_unit_testing/model/FullName.java
@@ -50,20 +50,24 @@ public boolean equals(Object o) {
if (this == o) {
return true;
}
+
if (o == null || getClass() != o.getClass()) {
return false;
}
FullName fullName = (FullName) o;
- return Objects.equals(name, fullName.name) && Objects.equals(surname, fullName.surname) && Objects.equals(
- patronymic, fullName.patronymic);
+
+ return Objects.equals(name, fullName.name) && Objects.equals(surname, fullName.surname)
+ && Objects.equals(patronymic, fullName.patronymic);
}
@Override
public int hashCode() {
int result = Objects.hashCode(name);
+
result = 31 * result + Objects.hashCode(surname);
result = 31 * result + Objects.hashCode(patronymic);
+
return result;
}
}
diff --git a/src/main/java/com/walking/lesson125_unit_testing/service/FullNameParsingService.java b/src/main/java/com/walking/lesson125_unit_testing/service/FullNameParsingService.java
index 864486b..b94c83e 100644
--- a/src/main/java/com/walking/lesson125_unit_testing/service/FullNameParsingService.java
+++ b/src/main/java/com/walking/lesson125_unit_testing/service/FullNameParsingService.java
@@ -1,6 +1,5 @@
package com.walking.lesson125_unit_testing.service;
-import com.walking.lesson125_unit_testing.exception.RegexValidationException;
import com.walking.lesson125_unit_testing.model.FullName;
public class FullNameParsingService {
@@ -11,23 +10,23 @@ public FullNameParsingService(FullNameValidationService fullNameValidationServic
}
public FullName parseFullName(String nameString) {
- try {
- fullNameValidationService.validateFullName(nameString);
+ if (nameString == null) {
+ throw new IllegalArgumentException("Unable parse null");
+ }
- String[] splitNameString = nameString.split(" ");
+ fullNameValidationService.validateFullName(nameString);
- String surname = splitNameString[0];
- fullNameValidationService.validateSurname(surname);
+ String[] splitNameString = nameString.split(" ");
- String name = splitNameString[1];
- fullNameValidationService.validateName(name);
+ String surname = splitNameString[0];
+ fullNameValidationService.validateSurname(surname);
- String patronymic = splitNameString[2];
- fullNameValidationService.validatePatronymic(patronymic);
+ String name = splitNameString[1];
+ fullNameValidationService.validateName(name);
- return new FullName(name, surname, patronymic);
- } catch (RegexValidationException e) {
- throw new RuntimeException("Failed parsing fullName", e);
- }
+ String patronymic = splitNameString[2];
+ fullNameValidationService.validatePatronymic(patronymic);
+
+ return new FullName(name, surname, patronymic);
}
}
diff --git a/src/main/java/com/walking/lesson125_unit_testing/service/FullNameValidationService.java b/src/main/java/com/walking/lesson125_unit_testing/service/FullNameValidationService.java
index 3873a82..0d003a3 100644
--- a/src/main/java/com/walking/lesson125_unit_testing/service/FullNameValidationService.java
+++ b/src/main/java/com/walking/lesson125_unit_testing/service/FullNameValidationService.java
@@ -3,13 +3,10 @@
import com.walking.lesson125_unit_testing.exception.RegexValidationException;
public class FullNameValidationService {
- public static final String FULL_NAME_REGEX = "^[А-Я][А-Яа-я-]* [А-Я][а-я]* [А-Я][а-я]+$";
- public static final String DOUBLE_SURNAME_REGEX = "[А-Я][а-я]*-[А-Я][а-я]*";
- public static final String NAME_REGEX = "[А-Я][а-я]*";
- public static final String PATRONYMIC_REGEX = "[А-Я][а-я]+";
-
- public FullNameValidationService() {
- }
+ private static final String FULL_NAME_REGEX = "^[А-Я][А-Яа-я-]* [А-Я][а-я]* [А-Я][а-я]+$";
+ private static final String DOUBLE_SURNAME_REGEX = "[А-Я][а-я]*-[А-Я][а-я]*";
+ private static final String NAME_REGEX = "[А-Я][а-я]*";
+ private static final String PATRONYMIC_REGEX = "[А-Я][а-я]+";
public void validateFullName(String nameString) {
if (!nameString.matches(FULL_NAME_REGEX)) {
diff --git a/src/test/java/com/walking/lesson125_unit_testing/service/FullNameParsingServiceTest.java b/src/test/java/com/walking/lesson125_unit_testing/service/FullNameParsingServiceTest.java
index 0e0f78e..03958bb 100644
--- a/src/test/java/com/walking/lesson125_unit_testing/service/FullNameParsingServiceTest.java
+++ b/src/test/java/com/walking/lesson125_unit_testing/service/FullNameParsingServiceTest.java
@@ -2,17 +2,15 @@
import com.walking.lesson125_unit_testing.exception.RegexValidationException;
import com.walking.lesson125_unit_testing.model.FullName;
-import org.junit.jupiter.api.BeforeAll;
-import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.junit.jupiter.api.function.Executable;
import org.mockito.InjectMocks;
import org.mockito.Mock;
-import org.mockito.Mockito;
import org.mockito.junit.jupiter.MockitoExtension;
import static org.junit.jupiter.api.Assertions.*;
+import static org.mockito.Mockito.*;
@ExtendWith(MockitoExtension.class)
class FullNameParsingServiceTest {
@@ -25,23 +23,50 @@ class FullNameParsingServiceTest {
@Test
void parseFullName_success() {
// given
- String testFullNameString = "Иванов Иван Иванович";
- FullName validFullName = new FullName("Иван", "Иванов", "Иванович");
+ FullName expected = new FullName("Иван", "Иванов", "Иванович");
+
// when
- FullName parsedFullName = fullNameParsingService.parseFullName(testFullNameString);
+ FullName result = fullNameParsingService.parseFullName("Иванов Иван Иванович");
+
// then
- assertEquals(validFullName, parsedFullName);
+ assertEquals(expected, result);
+
+ verify(fullNameValidationService).validateFullName(anyString());
+ verify(fullNameValidationService).validateSurname(anyString());
+ verify(fullNameValidationService).validateName(anyString());
+ verify(fullNameValidationService).validatePatronymic(anyString());
}
@Test
- void parseFullName_fail() {
- // given
- Mockito.doThrow(RegexValidationException.class)
- .when(fullNameValidationService)
- .validateFullName(Mockito.anyString());
- // when
- Executable actual = () -> fullNameParsingService.parseFullName(Mockito.any());
- // then
- assertThrows(RuntimeException.class, actual);
+ void parseFullName_failed_with_invalidFullName() {
+// given
+ doThrow(RegexValidationException.class).when(fullNameValidationService)
+ .validateFullName(anyString());
+
+// when
+ Executable actual = () -> fullNameParsingService.parseFullName(anyString());
+
+// then
+ assertThrows(RegexValidationException.class, actual);
+
+ verify(fullNameValidationService).validateFullName(anyString());
+
+ verify(fullNameValidationService, never()).validateSurname(anyString());
+ verify(fullNameValidationService, never()).validateName(anyString());
+ verify(fullNameValidationService, never()).validatePatronymic(anyString());
+ }
+
+ @Test
+ void parseFullName_failed_with_null() {
+// when
+ Executable actual = () -> fullNameParsingService.parseFullName(null);
+
+// then
+ assertThrows(IllegalArgumentException.class, actual);
+
+ verify(fullNameValidationService, never()).validateFullName(anyString());
+ verify(fullNameValidationService, never()).validateSurname(anyString());
+ verify(fullNameValidationService, never()).validateName(anyString());
+ verify(fullNameValidationService, never()).validatePatronymic(anyString());
}
-}
\ No newline at end of file
+}
diff --git a/src/test/java/com/walking/lesson125_unit_testing/service/FullNameValidationServiceTest.java b/src/test/java/com/walking/lesson125_unit_testing/service/FullNameValidationServiceTest.java
index d5fca20..0cd1eb6 100644
--- a/src/test/java/com/walking/lesson125_unit_testing/service/FullNameValidationServiceTest.java
+++ b/src/test/java/com/walking/lesson125_unit_testing/service/FullNameValidationServiceTest.java
@@ -1,138 +1,166 @@
package com.walking.lesson125_unit_testing.service;
import com.walking.lesson125_unit_testing.exception.RegexValidationException;
-import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.function.Executable;
import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.EmptySource;
-import org.junit.jupiter.params.provider.FieldSource;
-import org.junit.jupiter.params.provider.NullSource;
+import org.junit.jupiter.params.provider.MethodSource;
import java.util.List;
import static org.junit.jupiter.api.Assertions.*;
class FullNameValidationServiceTest {
- private FullNameValidationService fullNameValidationService;
+ private final FullNameValidationService fullNameValidationService =
+ new FullNameValidationService();
- private static final List INVALID_FULL_NAMES = List.of(
- "иванов Иван Иванович",
- "Иванов иван Иванович",
- "Иванов Иван иванович",
- "Иванов Иван",
- "Ivanov Ivan");
-
- private static final List VALID_FULL_NAMES = List.of(
- "Иванов Иван Иванович",
- "Иванов-Иванов Иван Иванович",
- "Иванов-Иванов И Иванович",
- "И-Иванов И Иванович");
-
- private static final List INVALID_NAMES = List.of(
- "иван",
- "Ivan",
- "Иван-иван");
-
- private static final List VALID_NAMES = List.of(
- "Иван");
-
- private static final List INVALID_DOUBLE_SURNAMES = List.of(
- "И-иванов",
- "иванов-И",
- "Иванов-И-Иванов",
- "Ivanov-I");
-
- private static final List VALID_DOUBLE_SURNAMES = List.of(
- "Иванов-Иванов",
- "И-Иванов");
-
- private static final List INVALID_PATRONYMICS = List.of(
- "иванович",
- "Ivanovich",
- "И",
- "Иванович-Степанович");
-
- private static final List VALID_PATRONYMICS = List.of(
- "Иванович");
+ @ParameterizedTest
+ @MethodSource("sourceValidFullName")
+ void validateFullName_success(String validFullName) {
+// when
+ Executable actual = () -> fullNameValidationService.validateFullName(validFullName);
- @BeforeEach
- void setUp() {
- fullNameValidationService = new FullNameValidationService();
+// then
+ assertDoesNotThrow(actual);
}
@ParameterizedTest
- @EmptySource
- @FieldSource("INVALID_FULL_NAMES")
- void validateFullName_invalidFullNames_ThrowsException(String invalidFullName) {
+ @MethodSource("sourceInvalidFullNames")
+ void validateFullName_failed_with_invalidFullName(String invalidFullName) {
// when
Executable actual = () -> fullNameValidationService.validateFullName(invalidFullName);
+
// then
assertThrows(RegexValidationException.class, actual);
}
+ @Test
+ void validateFullName_failed_with_null() {
+// when
+ Executable actual = () -> fullNameValidationService.validateFullName(null);
+
+// then
+ assertThrows(NullPointerException.class, actual);
+ }
+
@ParameterizedTest
- @FieldSource("VALID_FULL_NAMES")
- void validateFullName_validFullNames_DoesNotThrowException(String validFullName) {
+ @MethodSource("sourceValidNames")
+ void validateName_success(String validName) {
// when
- Executable actual = () -> fullNameValidationService.validateFullName(validFullName);
+ Executable actual = () -> fullNameValidationService.validateName(validName);
+
// then
assertDoesNotThrow(actual);
}
@ParameterizedTest
- @EmptySource
- @FieldSource("INVALID_NAMES")
- void validateName_invalidName_ThrowsException(String invalidName) {
+ @MethodSource("sourceInvalidNames")
+ void validateName_failed_with_invalidName(String invalidName) {
// when
Executable actual = () -> fullNameValidationService.validateName(invalidName);
+
// then
assertThrows(RegexValidationException.class, actual);
}
+ @Test
+ void validateName_failed_with_null() {
+// when
+ Executable actual = () -> fullNameValidationService.validateName(null);
+
+// then
+ assertThrows(NullPointerException.class, actual);
+ }
+
@ParameterizedTest
- @FieldSource("VALID_NAMES")
- void validateName_validNames_DoesNotThrowException(String validName) {
+ @MethodSource("sourceValidDoubleSurnames")
+ void validateSurName_success(String validSurname) {
// when
- Executable actual = () -> fullNameValidationService.validateName(validName);
+ Executable actual = () -> fullNameValidationService.validateSurname(validSurname);
+
// then
assertDoesNotThrow(actual);
}
@ParameterizedTest
- @EmptySource
- @FieldSource("INVALID_DOUBLE_SURNAMES")
- void validateSurname_invalidSurNames_ThrowsException(String invalidSurName) {
+ @MethodSource("sourceInvalidDoubleSurnames")
+ void validateSurname_failed_with_invalidSurname(String invalidSurname) {
// when
- Executable actual = () -> fullNameValidationService.validateSurname(invalidSurName);
+ Executable actual = () -> fullNameValidationService.validateSurname(invalidSurname);
+
// then
assertThrows(RegexValidationException.class, actual);
}
+ @Test
+ void validateSurname_failed_with_null() {
+// when
+ Executable actual = () -> fullNameValidationService.validateSurname(null);
+
+// then
+ assertThrows(NullPointerException.class, actual);
+ }
+
@ParameterizedTest
- @FieldSource("VALID_DOUBLE_SURNAMES")
- void validateSurName_validSurNames_DoesNotThrowException(String validSurName) {
+ @MethodSource("sourceValidPatronymics")
+ void validatePatronymic_success(String validPatronymic) {
// when
- Executable actual = () -> fullNameValidationService.validateSurname(validSurName);
+ Executable actual = () -> fullNameValidationService.validatePatronymic(validPatronymic);
+
// then
assertDoesNotThrow(actual);
}
@ParameterizedTest
- @EmptySource
- @FieldSource("INVALID_PATRONYMICS")
- void validatePatronymic_invalidPatronymics_ThrowsException(String invalidPatronymic) {
+ @MethodSource("sourceInvalidPatronymics")
+ void validatePatronymic_failed_with_invalidPatronymic(String invalidPatronymic) {
// when
Executable actual = () -> fullNameValidationService.validatePatronymic(invalidPatronymic);
+
// then
assertThrows(RegexValidationException.class, actual);
}
- @ParameterizedTest
- @FieldSource("VALID_PATRONYMICS")
- void validatePatronymic_validPatronymics_DoesNotThrowException(String validPatronymic) {
+ @Test
+ void validatePatronymic_failed_with_null() {
// when
- Executable actual = () -> fullNameValidationService.validatePatronymic(validPatronymic);
+ Executable actual = () -> fullNameValidationService.validatePatronymic(null);
+
// then
- assertDoesNotThrow(actual);
+ assertThrows(NullPointerException.class, actual);
+ }
+
+ static List sourceValidFullName() {
+ return List.of("Иванов Иван Иванович", "Иванов-Иванов Иван Иванович",
+ "Иванов-Иванов И Иванович", "И-Иванов И Иванович");
+ }
+
+ static List sourceInvalidFullNames() {
+ return List.of("", "иванов Иван Иванович", "Иванов иван Иванович", "Иванов Иван иванович",
+ "Иванов Иван", "Ivanov Ivan");
+ }
+
+ static List sourceValidNames() {
+ return List.of("Иван");
+ }
+
+ static List sourceInvalidNames() {
+ return List.of("", "иван", "Ivan", "Иван-иван");
+ }
+
+ static List sourceValidDoubleSurnames() {
+ return List.of("Иванов-Иванов", "И-Иванов");
+ }
+
+ static List sourceInvalidDoubleSurnames() {
+ return List.of("", "И-иванов", "иванов-И", "Иванов-И-Иванов", "Ivanov-I");
+ }
+
+ static List sourceValidPatronymics() {
+ return List.of("Иванович");
+ }
+
+ static List sourceInvalidPatronymics() {
+ return List.of("", "иванович", "Ivanovich", "И", "Иванович-Степанович");
}
-}
\ No newline at end of file
+}