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 +}