From 441a58755558b6f920d6bbbbc1da6aa14b471a75 Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Sat, 16 Mar 2019 10:11:32 +0300 Subject: [PATCH 01/15] Add files commit. --- .gitignore | 4 + pom.xml | 67 +++++++++++++ src/main/java/ru/otus/mkulikov/Main.java | 31 ++++++ .../java/ru/otus/mkulikov/model/Question.java | 99 +++++++++++++++++++ .../java/ru/otus/mkulikov/model/User.java | 35 +++++++ .../ru/otus/mkulikov/processor/Processor.java | 16 +++ .../mkulikov/processor/ProcessorImpl.java | 48 +++++++++ .../mkulikov/questions/QuestionsLoader.java | 21 ++++ .../questions/QuestionsLoaderImpl.java | 49 +++++++++ .../mkulikov/questions/QuestionsProcess.java | 12 +++ .../questions/QuestionsProcessImpl.java | 59 +++++++++++ .../mkulikov/registration/Registration.java | 19 ++++ .../registration/RegistrationImpl.java | 35 +++++++ src/main/resources/applicationContext.xml | 18 ++++ src/main/resources/questions.csv | 5 + 15 files changed, 518 insertions(+) create mode 100644 .gitignore create mode 100644 pom.xml create mode 100644 src/main/java/ru/otus/mkulikov/Main.java create mode 100644 src/main/java/ru/otus/mkulikov/model/Question.java create mode 100644 src/main/java/ru/otus/mkulikov/model/User.java create mode 100644 src/main/java/ru/otus/mkulikov/processor/Processor.java create mode 100644 src/main/java/ru/otus/mkulikov/processor/ProcessorImpl.java create mode 100644 src/main/java/ru/otus/mkulikov/questions/QuestionsLoader.java create mode 100644 src/main/java/ru/otus/mkulikov/questions/QuestionsLoaderImpl.java create mode 100644 src/main/java/ru/otus/mkulikov/questions/QuestionsProcess.java create mode 100644 src/main/java/ru/otus/mkulikov/questions/QuestionsProcessImpl.java create mode 100644 src/main/java/ru/otus/mkulikov/registration/Registration.java create mode 100644 src/main/java/ru/otus/mkulikov/registration/RegistrationImpl.java create mode 100644 src/main/resources/applicationContext.xml create mode 100644 src/main/resources/questions.csv diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..cba2a35 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.idea +target +*.iml +*.log \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..107185f --- /dev/null +++ b/pom.xml @@ -0,0 +1,67 @@ + + + 4.0.0 + + home-work-01 + + ru.otus.mkulikov + home-work + 1.0-SNAPSHOT + + + 11 + ${java.version} + ${java.version} + UTF-8 + + + + + org.springframework + spring-context + 5.0.9.RELEASE + + + + net.sf.opencsv + opencsv + 2.3 + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + ${java.version} + ${java.version} + ${encoding} + + + + + org.apache.maven.plugins + maven-resources-plugin + + ${encoding} + + + + + + + src/main/resources + + **/*.properties + **/*.xml + **/*.csv + + false + + + + \ No newline at end of file diff --git a/src/main/java/ru/otus/mkulikov/Main.java b/src/main/java/ru/otus/mkulikov/Main.java new file mode 100644 index 0000000..929ab68 --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/Main.java @@ -0,0 +1,31 @@ +package ru.otus.mkulikov; + +import org.springframework.context.support.ClassPathXmlApplicationContext; +import ru.otus.mkulikov.processor.Processor; + +import java.io.FileNotFoundException; +import java.net.URISyntaxException; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 2019-03-14 + * Time: 15:27 + */ + +public class Main { + + public static void main(String[] args) { + ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); + try { + Processor processor = (Processor) context.getBean("processor"); + processor.startTest(); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (URISyntaxException e) { + e.printStackTrace(); + } finally { + context.close(); + } + } +} diff --git a/src/main/java/ru/otus/mkulikov/model/Question.java b/src/main/java/ru/otus/mkulikov/model/Question.java new file mode 100644 index 0000000..5f40e3f --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/model/Question.java @@ -0,0 +1,99 @@ +package ru.otus.mkulikov.model; + +import java.io.Serializable; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 2019-03-14 + * Time: 15:54 + */ + +public class Question implements Serializable { + + private String id; + private String question; + private String answer1; + private String answer2; + private String answer3; + private String answer4; + private String trueAnswer; + private String userAnswer; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getQuestion() { + return question; + } + + public void setQuestion(String question) { + this.question = question; + } + + public String getAnswer1() { + return answer1; + } + + public void setAnswer1(String answer1) { + this.answer1 = answer1; + } + + public String getAnswer2() { + return answer2; + } + + public void setAnswer2(String answer2) { + this.answer2 = answer2; + } + + public String getAnswer3() { + return answer3; + } + + public void setAnswer3(String answer3) { + this.answer3 = answer3; + } + + public String getAnswer4() { + return answer4; + } + + public void setAnswer4(String answer4) { + this.answer4 = answer4; + } + + public String getTrueAnswer() { + return trueAnswer; + } + + public void setTrueAnswer(String trueAnswer) { + this.trueAnswer = trueAnswer; + } + + public String getUserAnswer() { + return userAnswer; + } + + public void setUserAnswer(String userAnswer) { + this.userAnswer = userAnswer; + } + + @Override + public String toString() { + return "Question {" + + "id='" + id + '\'' + + ", question='" + question + '\'' + + ", answer1='" + answer1 + '\'' + + ", answer2='" + answer2 + '\'' + + ", answer3='" + answer3 + '\'' + + ", answer4='" + answer4 + '\'' + + ", trueAnswer='" + trueAnswer + '\'' + + '}'; + } +} diff --git a/src/main/java/ru/otus/mkulikov/model/User.java b/src/main/java/ru/otus/mkulikov/model/User.java new file mode 100644 index 0000000..146fbd7 --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/model/User.java @@ -0,0 +1,35 @@ +package ru.otus.mkulikov.model; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 2019-03-14 + * Time: 15:29 + */ + +public class User { + + private final String name; + private final String surname; + + public User(String name, String surname) { + this.name = name; + this.surname = surname; + } + + public String getName() { + return name; + } + + public String getSurname() { + return surname; + } + + @Override + public String toString() { + return "User {" + + "name='" + name + '\'' + + ", surname='" + surname + '\'' + + '}'; + } +} diff --git a/src/main/java/ru/otus/mkulikov/processor/Processor.java b/src/main/java/ru/otus/mkulikov/processor/Processor.java new file mode 100644 index 0000000..e2c43e5 --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/processor/Processor.java @@ -0,0 +1,16 @@ +package ru.otus.mkulikov.processor; + +import java.io.FileNotFoundException; +import java.net.URISyntaxException; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 2019-03-14 + * Time: 15:54 + */ + +public interface Processor { + + void startTest() throws FileNotFoundException, URISyntaxException; +} diff --git a/src/main/java/ru/otus/mkulikov/processor/ProcessorImpl.java b/src/main/java/ru/otus/mkulikov/processor/ProcessorImpl.java new file mode 100644 index 0000000..6790959 --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/processor/ProcessorImpl.java @@ -0,0 +1,48 @@ +package ru.otus.mkulikov.processor; + +import ru.otus.mkulikov.questions.QuestionsProcess; +import ru.otus.mkulikov.questions.QuestionsLoader; +import ru.otus.mkulikov.registration.Registration; + +import java.io.FileNotFoundException; +import java.net.URISyntaxException; +import java.util.Scanner; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 2019-03-14 + * Time: 15:54 + */ + +public class ProcessorImpl implements Processor { + + private QuestionsProcess questionsProcess; + private Registration registration; + + public ProcessorImpl(QuestionsProcess questionsProcess, Registration registration) { + this.questionsProcess = questionsProcess; + this.registration = registration; + } + + @Override + public void startTest() throws FileNotFoundException, URISyntaxException { + Scanner in = new Scanner(System.in); + try { + getRegistration().addNewUser(in); + + getQuestionsProcess().loadQuestions(); + getQuestionsProcess().showQuestions(in); + } finally { + in.close(); + } + } + + public QuestionsProcess getQuestionsProcess() { + return questionsProcess; + } + + public Registration getRegistration() { + return registration; + } +} diff --git a/src/main/java/ru/otus/mkulikov/questions/QuestionsLoader.java b/src/main/java/ru/otus/mkulikov/questions/QuestionsLoader.java new file mode 100644 index 0000000..824305d --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/questions/QuestionsLoader.java @@ -0,0 +1,21 @@ +package ru.otus.mkulikov.questions; + +import ru.otus.mkulikov.model.Question; + +import java.io.FileNotFoundException; +import java.net.URISyntaxException; +import java.util.List; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 2019-03-14 + * Time: 16:41 + */ + +public interface QuestionsLoader { + + void loadFile() throws FileNotFoundException, URISyntaxException; + + List getQuestions(); +} diff --git a/src/main/java/ru/otus/mkulikov/questions/QuestionsLoaderImpl.java b/src/main/java/ru/otus/mkulikov/questions/QuestionsLoaderImpl.java new file mode 100644 index 0000000..4919922 --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/questions/QuestionsLoaderImpl.java @@ -0,0 +1,49 @@ +package ru.otus.mkulikov.questions; + +import au.com.bytecode.opencsv.CSVReader; +import au.com.bytecode.opencsv.bean.ColumnPositionMappingStrategy; +import au.com.bytecode.opencsv.bean.CsvToBean; +import ru.otus.mkulikov.model.Question; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.net.URISyntaxException; +import java.util.List; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 2019-03-14 + * Time: 16:42 + */ + +public class QuestionsLoaderImpl implements QuestionsLoader { + + private List questions; + + @Override + @SuppressWarnings({"rawtypes", "unchecked"}) + public void loadFile() throws FileNotFoundException, URISyntaxException { + CsvToBean csv = new CsvToBean(); + String csvFilename = "questions.csv"; + File file = new File(getClass().getResource("/" + csvFilename).toURI()); + + CSVReader csvReader = new CSVReader(new FileReader(file)); + questions = csv.parse(setColumMapping(), csvReader); + } + + @SuppressWarnings({"rawtypes", "unchecked"}) + private ColumnPositionMappingStrategy setColumMapping() { + ColumnPositionMappingStrategy strategy = new ColumnPositionMappingStrategy(); + strategy.setType(Question.class); + String[] columns = new String[]{"id", "question", "answer1", "answer2", "answer3", "answer4", "trueAnswer"}; + strategy.setColumnMapping(columns); + return strategy; + } + + @Override + public List getQuestions() { + return questions; + } +} diff --git a/src/main/java/ru/otus/mkulikov/questions/QuestionsProcess.java b/src/main/java/ru/otus/mkulikov/questions/QuestionsProcess.java new file mode 100644 index 0000000..a410d15 --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/questions/QuestionsProcess.java @@ -0,0 +1,12 @@ +package ru.otus.mkulikov.questions; + +import java.io.FileNotFoundException; +import java.net.URISyntaxException; +import java.util.Scanner; + +public interface QuestionsProcess { + + void loadQuestions() throws FileNotFoundException, URISyntaxException; + + void showQuestions(Scanner in); +} diff --git a/src/main/java/ru/otus/mkulikov/questions/QuestionsProcessImpl.java b/src/main/java/ru/otus/mkulikov/questions/QuestionsProcessImpl.java new file mode 100644 index 0000000..32f163d --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/questions/QuestionsProcessImpl.java @@ -0,0 +1,59 @@ +package ru.otus.mkulikov.questions; + +import ru.otus.mkulikov.model.Question; + +import java.io.FileNotFoundException; +import java.net.URISyntaxException; +import java.util.Scanner; + +public class QuestionsProcessImpl implements QuestionsProcess { + + private final String c_delimeter = "---------------------------------------------------"; + private final String c_answerNumbers = "1234"; + + private QuestionsLoader questionsLoader; + + public QuestionsProcessImpl(QuestionsLoader questionsLoader) { + this.questionsLoader = questionsLoader; + } + + @Override + public void loadQuestions() throws FileNotFoundException, URISyntaxException { + getQuestionsLoader().loadFile(); + } + + @Override + public void showQuestions(Scanner in) { + System.out.println(c_delimeter); + for (Question question : getQuestionsLoader().getQuestions()) { + System.out.println(question.getQuestion()); + System.out.println(question.getAnswer1()); + System.out.println(question.getAnswer2()); + System.out.println(question.getAnswer3()); + System.out.println(question.getAnswer4()); + + String answer = null; + boolean okAnswer = false; + int i = 0; + while (!okAnswer && i < 4) { + System.out.println("Введите номер ответа: "); + answer = in.nextLine(); + okAnswer = c_answerNumbers.contains(answer); + i++; + } + + question.setUserAnswer((!okAnswer && i == 4) ? "0" : answer); + System.out.println(c_delimeter); + } + + long count = getQuestionsLoader().getQuestions().stream() + .filter(obj -> obj.getTrueAnswer().equals(obj.getUserAnswer())) + .count(); + System.out.println("Количество правильных ответов: " + count + " из " + getQuestionsLoader().getQuestions().size()); + System.out.println(c_delimeter); + } + + public QuestionsLoader getQuestionsLoader() { + return questionsLoader; + } +} diff --git a/src/main/java/ru/otus/mkulikov/registration/Registration.java b/src/main/java/ru/otus/mkulikov/registration/Registration.java new file mode 100644 index 0000000..a129f40 --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/registration/Registration.java @@ -0,0 +1,19 @@ +package ru.otus.mkulikov.registration; + +import ru.otus.mkulikov.model.User; + +import java.util.Scanner; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 2019-03-14 + * Time: 16:34 + */ + +public interface Registration { + + void addNewUser(Scanner in); + + User getUser(); +} diff --git a/src/main/java/ru/otus/mkulikov/registration/RegistrationImpl.java b/src/main/java/ru/otus/mkulikov/registration/RegistrationImpl.java new file mode 100644 index 0000000..e8571db --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/registration/RegistrationImpl.java @@ -0,0 +1,35 @@ +package ru.otus.mkulikov.registration; + +import ru.otus.mkulikov.model.User; + +import java.util.Scanner; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 2019-03-14 + * Time: 16:34 + */ + +public class RegistrationImpl implements Registration { + + private User user; + + @Override + public void addNewUser(Scanner in) { + System.out.println("Введите свои данные"); + System.out.println("Фамилия: "); + String surname = in.nextLine(); + + System.out.println("Имя: "); + String name = in.nextLine(); + + user = new User(name, surname); + System.out.println(String.format("Здравствуйте, %s %s!", surname, name)); + } + + @Override + public User getUser() { + return user; + } +} diff --git a/src/main/resources/applicationContext.xml b/src/main/resources/applicationContext.xml new file mode 100644 index 0000000..86a39a5 --- /dev/null +++ b/src/main/resources/applicationContext.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/questions.csv b/src/main/resources/questions.csv new file mode 100644 index 0000000..6114d64 --- /dev/null +++ b/src/main/resources/questions.csv @@ -0,0 +1,5 @@ +1,Что из списка не является паттерном проектирования?,1. Фасад,2. Объект,3. Фабрика,4. Синглтон,2 +2,Какой тип не является примитивным?,1. String,2. int,3. char,4. boolean,1 +3,Сколько классов можно наследовать в Java?,1. Один,2. Два,3. Три,4. Четыре,1 +4,Какая коллекция содержит уникальне объекты?,1. List,2. Map,3. Set,4. Queue,3 +5,Какое значение нельзя положить в примитивный тип - int?,1. -1,2. 0,3. 10,4. null,4 \ No newline at end of file From b22839c7a513507b6298b3eb1ad9a08dfb1544e1 Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Sat, 16 Mar 2019 10:25:44 +0300 Subject: [PATCH 02/15] Edit readme. --- README.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 67d4ca0..acba68d 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,10 @@ -# OtusSpringHW +# OtusSpringHW Домашние задания по Spring для Otus. + +Домашнее задание #1: +Программа по проведению тестирования студентов +В ресурсах хранятся вопросы и различные ответы к ним в виде CSV файла (5 вопрсов). Программа должна спросить у пользователя фамилию и имя, спросить 5 вопросов из CSV-файла и вывести результат тестирования. + +Все сервисы в программе должны решать строго определённую задачу. Зависимости должны быть настроены в IoC контейнере. + +Опционально: сервисы, по возможности, покрыть тестами. \ No newline at end of file From baef643fd2db52fa53d521e77ef7ca91febe7094 Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Sat, 16 Mar 2019 10:27:58 +0300 Subject: [PATCH 03/15] Edit readme. --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index acba68d..f2d1946 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ -# OtusSpringHW -Домашние задания по Spring для Otus. +# OtusSpringHW Домашние задания по Spring для Otus. Домашнее задание #1: + Программа по проведению тестирования студентов В ресурсах хранятся вопросы и различные ответы к ним в виде CSV файла (5 вопрсов). Программа должна спросить у пользователя фамилию и имя, спросить 5 вопросов из CSV-файла и вывести результат тестирования. From 1afc67dd8c93b985ca2c49c243e21c30311472ad Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Sat, 16 Mar 2019 10:29:14 +0300 Subject: [PATCH 04/15] Edit readme. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f2d1946..1ff1818 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# OtusSpringHW Домашние задания по Spring для Otus. +# OtusSpringHW Домашнее задание #1: From 9d46552d8096480c8a63cd616319278e7d7433bb Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Mon, 18 Mar 2019 01:44:11 +0300 Subject: [PATCH 05/15] =?UTF-8?q?-=20=D0=9F=D0=B5=D1=80=D0=B5=D0=B8=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=BA=D0=BB?= =?UTF-8?q?=D0=B0=D1=81=D1=81=D0=BE=D0=B2.=20-=20=D0=94=D0=BE=D0=B1=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B8=D1=81=D0=BA=D0=BB?= =?UTF-8?q?=D1=8E=D1=87=D0=B5=D0=BD=D0=B8=D1=8F=20QuestionsFileLoadingExce?= =?UTF-8?q?ption.=20-=20=D0=A0=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=20=D1=81=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=BD=D1=81=D0=BE=D0=BB=D1=8C=D1=8E=20=D0=B2=D1=8B?= =?UTF-8?q?=D0=BD=D0=B5=D1=81=D0=B5=D0=BD=D0=B0=20=D0=B2=20=D1=81=D0=B5?= =?UTF-8?q?=D1=80=D0=B2=D0=B8=D1=81=20ConsoleService.=20-=20=D0=A2=D0=B5?= =?UTF-8?q?=D1=81=D1=82=D1=8B=20=D0=B4=D0=BB=D1=8F=20QuestionsDAO.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 +- README.md | 8 +- pom.xml | 20 +++++ src/main/java/ru/otus/mkulikov/Main.java | 12 +-- .../otus/mkulikov/console/ConsoleService.java | 15 ++++ .../mkulikov/console/ConsoleServiceImpl.java | 35 +++++++++ .../QuestionsFileLoadingException.java | 19 +++++ .../ru/otus/mkulikov/processor/Processor.java | 16 ---- .../mkulikov/processor/ProcessorImpl.java | 48 ------------ .../mkulikov/processor/ProcessorService.java | 15 ++++ .../processor/ProcessorServiceImpl.java | 37 ++++++++++ .../otus/mkulikov/questions/QuestionsDAO.java | 18 +++++ ...sLoaderImpl.java => QuestionsDAOImpl.java} | 31 ++++---- .../mkulikov/questions/QuestionsLoader.java | 21 ------ .../mkulikov/questions/QuestionsProcess.java | 12 --- .../questions/QuestionsProcessImpl.java | 59 --------------- .../mkulikov/questions/QuestionsService.java | 15 ++++ .../questions/QuestionsServiceImpl.java | 74 +++++++++++++++++++ .../mkulikov/registration/Registration.java | 19 ----- .../registration/RegistrationImpl.java | 35 --------- .../registration/RegistrationService.java | 13 ++++ .../registration/RegistrationServiceImpl.java | 38 ++++++++++ src/main/resources/applicationContext.xml | 14 +++- .../mkulikov/questions/QuestionsDAOTest.java | 31 ++++++++ src/test/resources/questions.csv | 3 + 25 files changed, 374 insertions(+), 237 deletions(-) create mode 100644 src/main/java/ru/otus/mkulikov/console/ConsoleService.java create mode 100644 src/main/java/ru/otus/mkulikov/console/ConsoleServiceImpl.java create mode 100644 src/main/java/ru/otus/mkulikov/exceptions/QuestionsFileLoadingException.java delete mode 100644 src/main/java/ru/otus/mkulikov/processor/Processor.java delete mode 100644 src/main/java/ru/otus/mkulikov/processor/ProcessorImpl.java create mode 100644 src/main/java/ru/otus/mkulikov/processor/ProcessorService.java create mode 100644 src/main/java/ru/otus/mkulikov/processor/ProcessorServiceImpl.java create mode 100644 src/main/java/ru/otus/mkulikov/questions/QuestionsDAO.java rename src/main/java/ru/otus/mkulikov/questions/{QuestionsLoaderImpl.java => QuestionsDAOImpl.java} (50%) delete mode 100644 src/main/java/ru/otus/mkulikov/questions/QuestionsLoader.java delete mode 100644 src/main/java/ru/otus/mkulikov/questions/QuestionsProcess.java delete mode 100644 src/main/java/ru/otus/mkulikov/questions/QuestionsProcessImpl.java create mode 100644 src/main/java/ru/otus/mkulikov/questions/QuestionsService.java create mode 100644 src/main/java/ru/otus/mkulikov/questions/QuestionsServiceImpl.java delete mode 100644 src/main/java/ru/otus/mkulikov/registration/Registration.java delete mode 100644 src/main/java/ru/otus/mkulikov/registration/RegistrationImpl.java create mode 100644 src/main/java/ru/otus/mkulikov/registration/RegistrationService.java create mode 100644 src/main/java/ru/otus/mkulikov/registration/RegistrationServiceImpl.java create mode 100644 src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java create mode 100644 src/test/resources/questions.csv diff --git a/.gitignore b/.gitignore index cba2a35..ced985d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ .idea target *.iml -*.log \ No newline at end of file +*.log +*.txt \ No newline at end of file diff --git a/README.md b/README.md index 1ff1818..8eebeba 100644 --- a/README.md +++ b/README.md @@ -7,4 +7,10 @@ Все сервисы в программе должны решать строго определённую задачу. Зависимости должны быть настроены в IoC контейнере. -Опционально: сервисы, по возможности, покрыть тестами. \ No newline at end of file +Опционально: сервисы, по возможности, покрыть тестами. + +### 19-03-18 Доработки: +- Переименование классов. +- Добавление исключения QuestionsFileLoadingException. +- Работа с консолью вынесена в сервис ConsoleService. +- Тесты для QuestionsDAO. \ No newline at end of file diff --git a/pom.xml b/pom.xml index 107185f..7e5f8a1 100644 --- a/pom.xml +++ b/pom.xml @@ -29,6 +29,26 @@ opencsv 2.3 + + + javax.annotation + javax.annotation-api + 1.3.2 + + + + org.junit.jupiter + junit-jupiter-api + 5.4.0 + test + + + + org.junit.jupiter + junit-jupiter-engine + 5.4.0 + test + diff --git a/src/main/java/ru/otus/mkulikov/Main.java b/src/main/java/ru/otus/mkulikov/Main.java index 929ab68..88e4918 100644 --- a/src/main/java/ru/otus/mkulikov/Main.java +++ b/src/main/java/ru/otus/mkulikov/Main.java @@ -1,10 +1,8 @@ package ru.otus.mkulikov; import org.springframework.context.support.ClassPathXmlApplicationContext; -import ru.otus.mkulikov.processor.Processor; - -import java.io.FileNotFoundException; -import java.net.URISyntaxException; +import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; +import ru.otus.mkulikov.processor.ProcessorService; /** * Created by IntelliJ IDEA. @@ -18,11 +16,9 @@ public class Main { public static void main(String[] args) { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); try { - Processor processor = (Processor) context.getBean("processor"); + ProcessorService processor = context.getBean(ProcessorService.class); processor.startTest(); - } catch (FileNotFoundException e) { - e.printStackTrace(); - } catch (URISyntaxException e) { + } catch (QuestionsFileLoadingException e) { e.printStackTrace(); } finally { context.close(); diff --git a/src/main/java/ru/otus/mkulikov/console/ConsoleService.java b/src/main/java/ru/otus/mkulikov/console/ConsoleService.java new file mode 100644 index 0000000..75d552d --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/console/ConsoleService.java @@ -0,0 +1,15 @@ +package ru.otus.mkulikov.console; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 17.03.2019 + * Time: 23:21 + */ + +public interface ConsoleService { + + void write(String text); + + String read(); +} diff --git a/src/main/java/ru/otus/mkulikov/console/ConsoleServiceImpl.java b/src/main/java/ru/otus/mkulikov/console/ConsoleServiceImpl.java new file mode 100644 index 0000000..881223e --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/console/ConsoleServiceImpl.java @@ -0,0 +1,35 @@ +package ru.otus.mkulikov.console; + +import javax.annotation.PreDestroy; +import java.util.Scanner; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 17.03.2019 + * Time: 23:21 + */ + +public class ConsoleServiceImpl implements ConsoleService { + + private Scanner in; + + public ConsoleServiceImpl() { + in = new Scanner(System.in); + } + + @Override + public void write(String text) { + System.out.println(text); + } + + @Override + public String read() { + return in.nextLine(); + } + + @PreDestroy + public void destroy() { + in.close(); + } +} diff --git a/src/main/java/ru/otus/mkulikov/exceptions/QuestionsFileLoadingException.java b/src/main/java/ru/otus/mkulikov/exceptions/QuestionsFileLoadingException.java new file mode 100644 index 0000000..5a4e3bc --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/exceptions/QuestionsFileLoadingException.java @@ -0,0 +1,19 @@ +package ru.otus.mkulikov.exceptions; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 2019-03-17 + * Time: 01:40 + */ + +public class QuestionsFileLoadingException extends Exception { + + public QuestionsFileLoadingException(String message) { + super(message); + } + + public QuestionsFileLoadingException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/src/main/java/ru/otus/mkulikov/processor/Processor.java b/src/main/java/ru/otus/mkulikov/processor/Processor.java deleted file mode 100644 index e2c43e5..0000000 --- a/src/main/java/ru/otus/mkulikov/processor/Processor.java +++ /dev/null @@ -1,16 +0,0 @@ -package ru.otus.mkulikov.processor; - -import java.io.FileNotFoundException; -import java.net.URISyntaxException; - -/** - * Created by IntelliJ IDEA. - * Developer: Maksim Kulikov - * Date: 2019-03-14 - * Time: 15:54 - */ - -public interface Processor { - - void startTest() throws FileNotFoundException, URISyntaxException; -} diff --git a/src/main/java/ru/otus/mkulikov/processor/ProcessorImpl.java b/src/main/java/ru/otus/mkulikov/processor/ProcessorImpl.java deleted file mode 100644 index 6790959..0000000 --- a/src/main/java/ru/otus/mkulikov/processor/ProcessorImpl.java +++ /dev/null @@ -1,48 +0,0 @@ -package ru.otus.mkulikov.processor; - -import ru.otus.mkulikov.questions.QuestionsProcess; -import ru.otus.mkulikov.questions.QuestionsLoader; -import ru.otus.mkulikov.registration.Registration; - -import java.io.FileNotFoundException; -import java.net.URISyntaxException; -import java.util.Scanner; - -/** - * Created by IntelliJ IDEA. - * Developer: Maksim Kulikov - * Date: 2019-03-14 - * Time: 15:54 - */ - -public class ProcessorImpl implements Processor { - - private QuestionsProcess questionsProcess; - private Registration registration; - - public ProcessorImpl(QuestionsProcess questionsProcess, Registration registration) { - this.questionsProcess = questionsProcess; - this.registration = registration; - } - - @Override - public void startTest() throws FileNotFoundException, URISyntaxException { - Scanner in = new Scanner(System.in); - try { - getRegistration().addNewUser(in); - - getQuestionsProcess().loadQuestions(); - getQuestionsProcess().showQuestions(in); - } finally { - in.close(); - } - } - - public QuestionsProcess getQuestionsProcess() { - return questionsProcess; - } - - public Registration getRegistration() { - return registration; - } -} diff --git a/src/main/java/ru/otus/mkulikov/processor/ProcessorService.java b/src/main/java/ru/otus/mkulikov/processor/ProcessorService.java new file mode 100644 index 0000000..f0bcccc --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/processor/ProcessorService.java @@ -0,0 +1,15 @@ +package ru.otus.mkulikov.processor; + +import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 2019-03-14 + * Time: 15:54 + */ + +public interface ProcessorService { + + void startTest() throws QuestionsFileLoadingException; +} diff --git a/src/main/java/ru/otus/mkulikov/processor/ProcessorServiceImpl.java b/src/main/java/ru/otus/mkulikov/processor/ProcessorServiceImpl.java new file mode 100644 index 0000000..e5b99d0 --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/processor/ProcessorServiceImpl.java @@ -0,0 +1,37 @@ +package ru.otus.mkulikov.processor; + +import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; +import ru.otus.mkulikov.questions.QuestionsService; +import ru.otus.mkulikov.registration.RegistrationService; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 2019-03-14 + * Time: 15:54 + */ + +public class ProcessorServiceImpl implements ProcessorService { + + private QuestionsService questionsProcess; + private RegistrationService registration; + + public ProcessorServiceImpl(QuestionsService questionsProcess, RegistrationService registration) { + this.questionsProcess = questionsProcess; + this.registration = registration; + } + + @Override + public void startTest() throws QuestionsFileLoadingException { + getRegistration().addNewUser(); + getQuestionsProcess().showQuestions(); + } + + public QuestionsService getQuestionsProcess() { + return questionsProcess; + } + + public RegistrationService getRegistration() { + return registration; + } +} diff --git a/src/main/java/ru/otus/mkulikov/questions/QuestionsDAO.java b/src/main/java/ru/otus/mkulikov/questions/QuestionsDAO.java new file mode 100644 index 0000000..9a99d97 --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/questions/QuestionsDAO.java @@ -0,0 +1,18 @@ +package ru.otus.mkulikov.questions; + +import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; +import ru.otus.mkulikov.model.Question; + +import java.util.List; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 2019-03-14 + * Time: 16:41 + */ + +public interface QuestionsDAO { + + List getQuestions(String csvFilename) throws QuestionsFileLoadingException; +} diff --git a/src/main/java/ru/otus/mkulikov/questions/QuestionsLoaderImpl.java b/src/main/java/ru/otus/mkulikov/questions/QuestionsDAOImpl.java similarity index 50% rename from src/main/java/ru/otus/mkulikov/questions/QuestionsLoaderImpl.java rename to src/main/java/ru/otus/mkulikov/questions/QuestionsDAOImpl.java index 4919922..e0de84e 100644 --- a/src/main/java/ru/otus/mkulikov/questions/QuestionsLoaderImpl.java +++ b/src/main/java/ru/otus/mkulikov/questions/QuestionsDAOImpl.java @@ -3,6 +3,7 @@ import au.com.bytecode.opencsv.CSVReader; import au.com.bytecode.opencsv.bean.ColumnPositionMappingStrategy; import au.com.bytecode.opencsv.bean.CsvToBean; +import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; import ru.otus.mkulikov.model.Question; import java.io.File; @@ -18,19 +19,23 @@ * Time: 16:42 */ -public class QuestionsLoaderImpl implements QuestionsLoader { +public class QuestionsDAOImpl implements QuestionsDAO { - private List questions; - - @Override @SuppressWarnings({"rawtypes", "unchecked"}) - public void loadFile() throws FileNotFoundException, URISyntaxException { - CsvToBean csv = new CsvToBean(); - String csvFilename = "questions.csv"; - File file = new File(getClass().getResource("/" + csvFilename).toURI()); - - CSVReader csvReader = new CSVReader(new FileReader(file)); - questions = csv.parse(setColumMapping(), csvReader); + public List loadFile(String csvFilename) throws QuestionsFileLoadingException { + List questions = null; + try { + CsvToBean csv = new CsvToBean(); + File file = new File(getClass().getResource("/" + csvFilename).toURI()); + + CSVReader csvReader = new CSVReader(new FileReader(file)); + questions = csv.parse(setColumMapping(), csvReader); + } catch (FileNotFoundException e) { + throw new QuestionsFileLoadingException("Файл с именем " + csvFilename + " не найден!", e); + } catch (URISyntaxException e) { + throw new QuestionsFileLoadingException("Ошибка чтения файла!", e); + } + return questions; } @SuppressWarnings({"rawtypes", "unchecked"}) @@ -43,7 +48,7 @@ private ColumnPositionMappingStrategy setColumMapping() { } @Override - public List getQuestions() { - return questions; + public List getQuestions(String csvFilename) throws QuestionsFileLoadingException { + return loadFile(csvFilename); } } diff --git a/src/main/java/ru/otus/mkulikov/questions/QuestionsLoader.java b/src/main/java/ru/otus/mkulikov/questions/QuestionsLoader.java deleted file mode 100644 index 824305d..0000000 --- a/src/main/java/ru/otus/mkulikov/questions/QuestionsLoader.java +++ /dev/null @@ -1,21 +0,0 @@ -package ru.otus.mkulikov.questions; - -import ru.otus.mkulikov.model.Question; - -import java.io.FileNotFoundException; -import java.net.URISyntaxException; -import java.util.List; - -/** - * Created by IntelliJ IDEA. - * Developer: Maksim Kulikov - * Date: 2019-03-14 - * Time: 16:41 - */ - -public interface QuestionsLoader { - - void loadFile() throws FileNotFoundException, URISyntaxException; - - List getQuestions(); -} diff --git a/src/main/java/ru/otus/mkulikov/questions/QuestionsProcess.java b/src/main/java/ru/otus/mkulikov/questions/QuestionsProcess.java deleted file mode 100644 index a410d15..0000000 --- a/src/main/java/ru/otus/mkulikov/questions/QuestionsProcess.java +++ /dev/null @@ -1,12 +0,0 @@ -package ru.otus.mkulikov.questions; - -import java.io.FileNotFoundException; -import java.net.URISyntaxException; -import java.util.Scanner; - -public interface QuestionsProcess { - - void loadQuestions() throws FileNotFoundException, URISyntaxException; - - void showQuestions(Scanner in); -} diff --git a/src/main/java/ru/otus/mkulikov/questions/QuestionsProcessImpl.java b/src/main/java/ru/otus/mkulikov/questions/QuestionsProcessImpl.java deleted file mode 100644 index 32f163d..0000000 --- a/src/main/java/ru/otus/mkulikov/questions/QuestionsProcessImpl.java +++ /dev/null @@ -1,59 +0,0 @@ -package ru.otus.mkulikov.questions; - -import ru.otus.mkulikov.model.Question; - -import java.io.FileNotFoundException; -import java.net.URISyntaxException; -import java.util.Scanner; - -public class QuestionsProcessImpl implements QuestionsProcess { - - private final String c_delimeter = "---------------------------------------------------"; - private final String c_answerNumbers = "1234"; - - private QuestionsLoader questionsLoader; - - public QuestionsProcessImpl(QuestionsLoader questionsLoader) { - this.questionsLoader = questionsLoader; - } - - @Override - public void loadQuestions() throws FileNotFoundException, URISyntaxException { - getQuestionsLoader().loadFile(); - } - - @Override - public void showQuestions(Scanner in) { - System.out.println(c_delimeter); - for (Question question : getQuestionsLoader().getQuestions()) { - System.out.println(question.getQuestion()); - System.out.println(question.getAnswer1()); - System.out.println(question.getAnswer2()); - System.out.println(question.getAnswer3()); - System.out.println(question.getAnswer4()); - - String answer = null; - boolean okAnswer = false; - int i = 0; - while (!okAnswer && i < 4) { - System.out.println("Введите номер ответа: "); - answer = in.nextLine(); - okAnswer = c_answerNumbers.contains(answer); - i++; - } - - question.setUserAnswer((!okAnswer && i == 4) ? "0" : answer); - System.out.println(c_delimeter); - } - - long count = getQuestionsLoader().getQuestions().stream() - .filter(obj -> obj.getTrueAnswer().equals(obj.getUserAnswer())) - .count(); - System.out.println("Количество правильных ответов: " + count + " из " + getQuestionsLoader().getQuestions().size()); - System.out.println(c_delimeter); - } - - public QuestionsLoader getQuestionsLoader() { - return questionsLoader; - } -} diff --git a/src/main/java/ru/otus/mkulikov/questions/QuestionsService.java b/src/main/java/ru/otus/mkulikov/questions/QuestionsService.java new file mode 100644 index 0000000..8c80904 --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/questions/QuestionsService.java @@ -0,0 +1,15 @@ +package ru.otus.mkulikov.questions; + +import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 2019-03-14 + * Time: 16:41 + */ + +public interface QuestionsService { + + void showQuestions() throws QuestionsFileLoadingException; +} diff --git a/src/main/java/ru/otus/mkulikov/questions/QuestionsServiceImpl.java b/src/main/java/ru/otus/mkulikov/questions/QuestionsServiceImpl.java new file mode 100644 index 0000000..ffcacf3 --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/questions/QuestionsServiceImpl.java @@ -0,0 +1,74 @@ +package ru.otus.mkulikov.questions; + +import ru.otus.mkulikov.console.ConsoleService; +import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; +import ru.otus.mkulikov.model.Question; + +import java.util.List; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 2019-03-14 + * Time: 16:41 + */ + +public class QuestionsServiceImpl implements QuestionsService { + + private final String c_delimeter = "---------------------------------------------------"; + private final String c_answerNumbers = "1234"; + private final String c_questionsFileName = "questions.csv"; + + private QuestionsDAO questionsLoader; + private ConsoleService consoleService; + + public QuestionsServiceImpl(QuestionsDAO questionsLoader, ConsoleService consoleService) { + this.questionsLoader = questionsLoader; + this.consoleService = consoleService; + } + + @Override + public void showQuestions() throws QuestionsFileLoadingException { + getConsoleService().write(c_delimeter); + List questions = getQuestionsLoader().getQuestions(c_questionsFileName); + + if (questions == null) { + throw new QuestionsFileLoadingException("Список вопросов пуст!"); + } + + for (Question question : questions) { + getConsoleService().write(question.getQuestion()); + getConsoleService().write(question.getAnswer1()); + getConsoleService().write(question.getAnswer2()); + getConsoleService().write(question.getAnswer3()); + getConsoleService().write(question.getAnswer4()); + + String answer = null; + boolean okAnswer = false; + int i = 0; + while (!okAnswer && i < 4) { + System.out.println("Введите номер ответа: "); + answer = getConsoleService().read(); + okAnswer = c_answerNumbers.contains(answer); + i++; + } + + question.setUserAnswer((!okAnswer && i == 4) ? "0" : answer); + getConsoleService().write(c_delimeter); + } + + long count = questions.stream() + .filter(obj -> obj.getTrueAnswer().equals(obj.getUserAnswer())) + .count(); + getConsoleService().write("Количество правильных ответов: " + count + " из " + questions.size()); + getConsoleService().write(c_delimeter); + } + + public QuestionsDAO getQuestionsLoader() { + return questionsLoader; + } + + public ConsoleService getConsoleService() { + return consoleService; + } +} diff --git a/src/main/java/ru/otus/mkulikov/registration/Registration.java b/src/main/java/ru/otus/mkulikov/registration/Registration.java deleted file mode 100644 index a129f40..0000000 --- a/src/main/java/ru/otus/mkulikov/registration/Registration.java +++ /dev/null @@ -1,19 +0,0 @@ -package ru.otus.mkulikov.registration; - -import ru.otus.mkulikov.model.User; - -import java.util.Scanner; - -/** - * Created by IntelliJ IDEA. - * Developer: Maksim Kulikov - * Date: 2019-03-14 - * Time: 16:34 - */ - -public interface Registration { - - void addNewUser(Scanner in); - - User getUser(); -} diff --git a/src/main/java/ru/otus/mkulikov/registration/RegistrationImpl.java b/src/main/java/ru/otus/mkulikov/registration/RegistrationImpl.java deleted file mode 100644 index e8571db..0000000 --- a/src/main/java/ru/otus/mkulikov/registration/RegistrationImpl.java +++ /dev/null @@ -1,35 +0,0 @@ -package ru.otus.mkulikov.registration; - -import ru.otus.mkulikov.model.User; - -import java.util.Scanner; - -/** - * Created by IntelliJ IDEA. - * Developer: Maksim Kulikov - * Date: 2019-03-14 - * Time: 16:34 - */ - -public class RegistrationImpl implements Registration { - - private User user; - - @Override - public void addNewUser(Scanner in) { - System.out.println("Введите свои данные"); - System.out.println("Фамилия: "); - String surname = in.nextLine(); - - System.out.println("Имя: "); - String name = in.nextLine(); - - user = new User(name, surname); - System.out.println(String.format("Здравствуйте, %s %s!", surname, name)); - } - - @Override - public User getUser() { - return user; - } -} diff --git a/src/main/java/ru/otus/mkulikov/registration/RegistrationService.java b/src/main/java/ru/otus/mkulikov/registration/RegistrationService.java new file mode 100644 index 0000000..6e420d0 --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/registration/RegistrationService.java @@ -0,0 +1,13 @@ +package ru.otus.mkulikov.registration; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 2019-03-14 + * Time: 16:34 + */ + +public interface RegistrationService { + + void addNewUser(); +} diff --git a/src/main/java/ru/otus/mkulikov/registration/RegistrationServiceImpl.java b/src/main/java/ru/otus/mkulikov/registration/RegistrationServiceImpl.java new file mode 100644 index 0000000..b3e5db4 --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/registration/RegistrationServiceImpl.java @@ -0,0 +1,38 @@ +package ru.otus.mkulikov.registration; + +import ru.otus.mkulikov.console.ConsoleService; +import ru.otus.mkulikov.model.User; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 2019-03-14 + * Time: 16:34 + */ + +public class RegistrationServiceImpl implements RegistrationService { + + private User user; + private ConsoleService consoleService; + + public RegistrationServiceImpl(ConsoleService consoleService) { + this.consoleService = consoleService; + } + + @Override + public void addNewUser() { + getConsoleService().write("Введите свои данные"); + getConsoleService().write("Фамилия: "); + String surname = getConsoleService().read(); + + getConsoleService().write("Имя: "); + String name = getConsoleService().read(); + + user = new User(name, surname); + getConsoleService().write(String.format("Здравствуйте, %s %s!", surname, name)); + } + + public ConsoleService getConsoleService() { + return consoleService; + } +} diff --git a/src/main/resources/applicationContext.xml b/src/main/resources/applicationContext.xml index 86a39a5..d0dc24a 100644 --- a/src/main/resources/applicationContext.xml +++ b/src/main/resources/applicationContext.xml @@ -3,14 +3,20 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> - - + - + + + + + + + + - + diff --git a/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java b/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java new file mode 100644 index 0000000..19c5d55 --- /dev/null +++ b/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java @@ -0,0 +1,31 @@ +package ru.otus.mkulikov.questions; + +import org.junit.jupiter.api.Test; +import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; +import ru.otus.mkulikov.model.Question; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +class QuestionsDAOTest { + + private final String c_questionsFileName = "questions.csv"; + + @Test + public void loadQuestionsTest() { + try { + QuestionsDAO questionsDAO = new QuestionsDAOImpl(); + List questions = questionsDAO.getQuestions(c_questionsFileName); + + assertNotNull(questions); + assertEquals(questions.size(), 3); + assertEquals(questions.get(0).getQuestion(), "Тест1"); + assertEquals(questions.get(1).getQuestion(), "Тест2"); + assertEquals(questions.get(2).getQuestion(), "Тест3"); + } catch (QuestionsFileLoadingException e) { + e.printStackTrace(); + } + } +} \ No newline at end of file diff --git a/src/test/resources/questions.csv b/src/test/resources/questions.csv new file mode 100644 index 0000000..47cc49f --- /dev/null +++ b/src/test/resources/questions.csv @@ -0,0 +1,3 @@ +1,Тест1,Ответ1,Ответ2,Ответ3,Ответ4,Ответ1 +2,Тест2,Ответ1,Ответ2,Ответ3,Ответ4,Ответ1 +3,Тест3,Ответ1,Ответ2,Ответ3,Ответ4,Ответ1 From c3266f7cc25d91cfe827c1c189609f279b8534b1 Mon Sep 17 00:00:00 2001 From: "maxim.kulikov" Date: Tue, 19 Mar 2019 10:39:09 +0300 Subject: [PATCH 06/15] =?UTF-8?q?-=20=D0=9F=D0=B5=D1=80=D0=B5=D0=B8=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D0=BE=D0=B2=D0=B0=D0=BD=D1=8B=20=D0=BA=D0=BB=D0=B0?= =?UTF-8?q?=D1=81=D1=81=D1=8B.=20-=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D1=8B=20=D1=82=D0=B5=D1=81=D1=82=D1=8B.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 10 ++- pom.xml | 13 +++ .../mkulikov/constants/StringConstants.java | 16 ++++ .../processor/ProcessorServiceImpl.java | 23 +++-- .../mkulikov/questions/QuestionsDAOImpl.java | 20 ++++- .../questions/QuestionsServiceImpl.java | 23 +++-- .../registration/RegistrationService.java | 4 +- .../registration/RegistrationServiceImpl.java | 15 ++-- src/main/resources/applicationContext.xml | 20 ++--- .../QuestionsFileLoadingExceptionTest.java | 29 ++++++ .../ru/otus/mkulikov/model/QuestionTest.java | 90 +++++++++++++++++++ .../java/ru/otus/mkulikov/model/UserTest.java | 33 +++++++ .../processor/ProcessorServiceImplTest.java | 56 ++++++++++++ .../mkulikov/questions/QuestionsDAOTest.java | 42 +++++++-- .../questions/QuestionsServiceImplTest.java | 56 ++++++++++++ .../RegistrationServiceImplTest.java | 38 ++++++++ src/test/resources/test_questions.csv | 3 + 17 files changed, 447 insertions(+), 44 deletions(-) create mode 100644 src/main/java/ru/otus/mkulikov/constants/StringConstants.java create mode 100644 src/test/java/ru/otus/mkulikov/exceptions/QuestionsFileLoadingExceptionTest.java create mode 100644 src/test/java/ru/otus/mkulikov/model/QuestionTest.java create mode 100644 src/test/java/ru/otus/mkulikov/model/UserTest.java create mode 100644 src/test/java/ru/otus/mkulikov/processor/ProcessorServiceImplTest.java create mode 100644 src/test/java/ru/otus/mkulikov/questions/QuestionsServiceImplTest.java create mode 100644 src/test/java/ru/otus/mkulikov/registration/RegistrationServiceImplTest.java create mode 100644 src/test/resources/test_questions.csv diff --git a/README.md b/README.md index 8eebeba..10840c6 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,11 @@ Опционально: сервисы, по возможности, покрыть тестами. ### 19-03-18 Доработки: -- Переименование классов. -- Добавление исключения QuestionsFileLoadingException. +- Переименованы классы. +- Добавлено исключение QuestionsFileLoadingException. - Работа с консолью вынесена в сервис ConsoleService. -- Тесты для QuestionsDAO. \ No newline at end of file +- Тесты для QuestionsDAO. + +### 19-03-19 Доработки: +- Переименованы классы. +- Добавлены тесты. \ No newline at end of file diff --git a/pom.xml b/pom.xml index 7e5f8a1..942e1cb 100644 --- a/pom.xml +++ b/pom.xml @@ -49,6 +49,13 @@ 5.4.0 test + + + org.assertj + assertj-core + 3.11.1 + test + @@ -69,6 +76,12 @@ ${encoding} + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.21.0 diff --git a/src/main/java/ru/otus/mkulikov/constants/StringConstants.java b/src/main/java/ru/otus/mkulikov/constants/StringConstants.java new file mode 100644 index 0000000..0673a74 --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/constants/StringConstants.java @@ -0,0 +1,16 @@ +package ru.otus.mkulikov.constants; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 2019-03-18 + * Time: 13:07 + */ + +public class StringConstants { + + public static final String c_error_load_consoleService = "Ошибка загрузки ConsoleService!"; + public static final String c_error_load_questionsDAO = "Ошибка загрузки QuestionsDAO!"; + public static final String c_error_load_questionsService = "Ошибка загрузки QuestionsService!"; + public static final String c_error_load_registrationService = "Ошибка загрузки RegistrationService!"; +} diff --git a/src/main/java/ru/otus/mkulikov/processor/ProcessorServiceImpl.java b/src/main/java/ru/otus/mkulikov/processor/ProcessorServiceImpl.java index e5b99d0..626be7a 100644 --- a/src/main/java/ru/otus/mkulikov/processor/ProcessorServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/processor/ProcessorServiceImpl.java @@ -4,6 +4,9 @@ import ru.otus.mkulikov.questions.QuestionsService; import ru.otus.mkulikov.registration.RegistrationService; +import static ru.otus.mkulikov.constants.StringConstants.c_error_load_questionsService; +import static ru.otus.mkulikov.constants.StringConstants.c_error_load_registrationService; + /** * Created by IntelliJ IDEA. * Developer: Maksim Kulikov @@ -13,25 +16,31 @@ public class ProcessorServiceImpl implements ProcessorService { - private QuestionsService questionsProcess; + private QuestionsService questionsService; private RegistrationService registration; - public ProcessorServiceImpl(QuestionsService questionsProcess, RegistrationService registration) { - this.questionsProcess = questionsProcess; + public ProcessorServiceImpl(QuestionsService questionsService, RegistrationService registration) { + this.questionsService = questionsService; this.registration = registration; } @Override public void startTest() throws QuestionsFileLoadingException { getRegistration().addNewUser(); - getQuestionsProcess().showQuestions(); + getQuestionsService().showQuestions(); } - public QuestionsService getQuestionsProcess() { - return questionsProcess; + public QuestionsService getQuestionsService() throws QuestionsFileLoadingException { + if (questionsService == null) { + throw new QuestionsFileLoadingException(c_error_load_questionsService); + } + return questionsService; } - public RegistrationService getRegistration() { + public RegistrationService getRegistration() throws QuestionsFileLoadingException { + if (registration == null) { + throw new QuestionsFileLoadingException(c_error_load_registrationService); + } return registration; } } diff --git a/src/main/java/ru/otus/mkulikov/questions/QuestionsDAOImpl.java b/src/main/java/ru/otus/mkulikov/questions/QuestionsDAOImpl.java index e0de84e..1ec9636 100644 --- a/src/main/java/ru/otus/mkulikov/questions/QuestionsDAOImpl.java +++ b/src/main/java/ru/otus/mkulikov/questions/QuestionsDAOImpl.java @@ -9,7 +9,9 @@ import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; +import java.net.URI; import java.net.URISyntaxException; +import java.net.URL; import java.util.List; /** @@ -22,13 +24,25 @@ public class QuestionsDAOImpl implements QuestionsDAO { @SuppressWarnings({"rawtypes", "unchecked"}) - public List loadFile(String csvFilename) throws QuestionsFileLoadingException { + private List loadFile(String csvFilename) throws QuestionsFileLoadingException { + if (csvFilename == null) { + throw new QuestionsFileLoadingException("Имя файла не может быть null!"); + } + List questions = null; try { - CsvToBean csv = new CsvToBean(); - File file = new File(getClass().getResource("/" + csvFilename).toURI()); + URL url = getClass().getResource("/" + csvFilename); + if (url == null) { + throw new QuestionsFileLoadingException( + String.format("Ошибка загрузки ресурса с именем %s!", csvFilename) + ); + } + + File file = new File(url.toURI()); CSVReader csvReader = new CSVReader(new FileReader(file)); + CsvToBean csv = new CsvToBean(); + questions = csv.parse(setColumMapping(), csvReader); } catch (FileNotFoundException e) { throw new QuestionsFileLoadingException("Файл с именем " + csvFilename + " не найден!", e); diff --git a/src/main/java/ru/otus/mkulikov/questions/QuestionsServiceImpl.java b/src/main/java/ru/otus/mkulikov/questions/QuestionsServiceImpl.java index ffcacf3..fe5c66d 100644 --- a/src/main/java/ru/otus/mkulikov/questions/QuestionsServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/questions/QuestionsServiceImpl.java @@ -6,6 +6,9 @@ import java.util.List; +import static ru.otus.mkulikov.constants.StringConstants.c_error_load_consoleService; +import static ru.otus.mkulikov.constants.StringConstants.c_error_load_questionsDAO; + /** * Created by IntelliJ IDEA. * Developer: Maksim Kulikov @@ -19,18 +22,18 @@ public class QuestionsServiceImpl implements QuestionsService { private final String c_answerNumbers = "1234"; private final String c_questionsFileName = "questions.csv"; - private QuestionsDAO questionsLoader; + private QuestionsDAO questionsDAO; private ConsoleService consoleService; - public QuestionsServiceImpl(QuestionsDAO questionsLoader, ConsoleService consoleService) { - this.questionsLoader = questionsLoader; + public QuestionsServiceImpl(QuestionsDAO questionsDAO, ConsoleService consoleService) { + this.questionsDAO = questionsDAO; this.consoleService = consoleService; } @Override public void showQuestions() throws QuestionsFileLoadingException { getConsoleService().write(c_delimeter); - List questions = getQuestionsLoader().getQuestions(c_questionsFileName); + List questions = getQuestionsDAO().getQuestions(c_questionsFileName); if (questions == null) { throw new QuestionsFileLoadingException("Список вопросов пуст!"); @@ -64,11 +67,17 @@ public void showQuestions() throws QuestionsFileLoadingException { getConsoleService().write(c_delimeter); } - public QuestionsDAO getQuestionsLoader() { - return questionsLoader; + public QuestionsDAO getQuestionsDAO() throws QuestionsFileLoadingException { + if (questionsDAO == null) { + throw new QuestionsFileLoadingException(c_error_load_questionsDAO); + } + return questionsDAO; } - public ConsoleService getConsoleService() { + public ConsoleService getConsoleService() throws QuestionsFileLoadingException { + if (consoleService == null) { + throw new QuestionsFileLoadingException(c_error_load_consoleService); + } return consoleService; } } diff --git a/src/main/java/ru/otus/mkulikov/registration/RegistrationService.java b/src/main/java/ru/otus/mkulikov/registration/RegistrationService.java index 6e420d0..f3a68ea 100644 --- a/src/main/java/ru/otus/mkulikov/registration/RegistrationService.java +++ b/src/main/java/ru/otus/mkulikov/registration/RegistrationService.java @@ -1,5 +1,7 @@ package ru.otus.mkulikov.registration; +import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; + /** * Created by IntelliJ IDEA. * Developer: Maksim Kulikov @@ -9,5 +11,5 @@ public interface RegistrationService { - void addNewUser(); + void addNewUser() throws QuestionsFileLoadingException; } diff --git a/src/main/java/ru/otus/mkulikov/registration/RegistrationServiceImpl.java b/src/main/java/ru/otus/mkulikov/registration/RegistrationServiceImpl.java index b3e5db4..b50d935 100644 --- a/src/main/java/ru/otus/mkulikov/registration/RegistrationServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/registration/RegistrationServiceImpl.java @@ -1,8 +1,11 @@ package ru.otus.mkulikov.registration; import ru.otus.mkulikov.console.ConsoleService; +import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; import ru.otus.mkulikov.model.User; +import static ru.otus.mkulikov.constants.StringConstants.c_error_load_consoleService; + /** * Created by IntelliJ IDEA. * Developer: Maksim Kulikov @@ -12,7 +15,6 @@ public class RegistrationServiceImpl implements RegistrationService { - private User user; private ConsoleService consoleService; public RegistrationServiceImpl(ConsoleService consoleService) { @@ -20,7 +22,7 @@ public RegistrationServiceImpl(ConsoleService consoleService) { } @Override - public void addNewUser() { + public void addNewUser() throws QuestionsFileLoadingException { getConsoleService().write("Введите свои данные"); getConsoleService().write("Фамилия: "); String surname = getConsoleService().read(); @@ -28,11 +30,14 @@ public void addNewUser() { getConsoleService().write("Имя: "); String name = getConsoleService().read(); - user = new User(name, surname); - getConsoleService().write(String.format("Здравствуйте, %s %s!", surname, name)); + User user = new User(name, surname); + getConsoleService().write(String.format("Здравствуйте, %s %s!", user.getSurname(), user.getName())); } - public ConsoleService getConsoleService() { + public ConsoleService getConsoleService() throws QuestionsFileLoadingException { + if (consoleService == null) { + throw new QuestionsFileLoadingException(c_error_load_consoleService); + } return consoleService; } } diff --git a/src/main/resources/applicationContext.xml b/src/main/resources/applicationContext.xml index d0dc24a..c85fd3c 100644 --- a/src/main/resources/applicationContext.xml +++ b/src/main/resources/applicationContext.xml @@ -3,22 +3,22 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> - + - - + + - + - - - + + + - - - + + + \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/exceptions/QuestionsFileLoadingExceptionTest.java b/src/test/java/ru/otus/mkulikov/exceptions/QuestionsFileLoadingExceptionTest.java new file mode 100644 index 0000000..3b40a89 --- /dev/null +++ b/src/test/java/ru/otus/mkulikov/exceptions/QuestionsFileLoadingExceptionTest.java @@ -0,0 +1,29 @@ +package ru.otus.mkulikov.exceptions; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 2019-03-18 + * Time: 11:39 + */ + +@DisplayName("Класс исключения QuestionsFileLoadingException") +class QuestionsFileLoadingExceptionTest { + + private final String c_not_supperted = "Not supported"; + + @Test + @DisplayName("Корректное заполнение исключения") + void shouldThrowException() { + Throwable exception = assertThrows(QuestionsFileLoadingException.class, () -> { + throw new QuestionsFileLoadingException(c_not_supperted); + }); + assertEquals(c_not_supperted, exception.getMessage()); + } +} \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/model/QuestionTest.java b/src/test/java/ru/otus/mkulikov/model/QuestionTest.java new file mode 100644 index 0000000..c7a8c27 --- /dev/null +++ b/src/test/java/ru/otus/mkulikov/model/QuestionTest.java @@ -0,0 +1,90 @@ +package ru.otus.mkulikov.model; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 2019-03-18 + * Time: 11:13 + */ + +@DisplayName("Класс Question") +class QuestionTest { + + private final String c_id = "1"; + private final String c_question = "Question"; + private final String c_userAnswer = "UserAnswer"; + private final String c_trueAnswer = "TrueAnswer"; + private final String c_answer1 = "Answer1"; + private final String c_answer2 = "Answer2"; + private final String c_answer3 = "Answer3"; + private final String c_answer4 = "Answer4"; + + private Question question; + + @BeforeEach + public void createModelQuestion() { + question = new Question(); + question.setId(c_id); + question.setQuestion(c_question); + question.setUserAnswer(c_userAnswer); + question.setTrueAnswer(c_trueAnswer); + question.setAnswer1(c_answer1); + question.setAnswer2(c_answer2); + question.setAnswer3(c_answer3); + question.setAnswer4(c_answer4); + } + + @Test + @DisplayName("Корректное заполнение id") + public void fillIdTest() { + assertEquals(c_id, question.getId()); + } + + @Test + @DisplayName("Корректное заполнение question") + public void fillQuestionTest() { + assertEquals(c_question, question.getQuestion()); + } + + @Test + @DisplayName("Корректное заполнение userAnswer") + public void fillUserAnsweTest() { + assertEquals(c_userAnswer, question.getUserAnswer()); + } + + @Test + @DisplayName("Корректное заполнение trueAnswer") + public void fillTrueAnsweTest() { + assertEquals(c_trueAnswer, question.getTrueAnswer()); + } + + @Test + @DisplayName("Корректное заполнение answer1") + public void fillAnswer1AnsweTest() { + assertEquals(c_answer1, question.getAnswer1()); + } + + @Test + @DisplayName("Корректное заполнение answer2") + public void fillAnswer2AnsweTest() { + assertEquals(c_answer2, question.getAnswer2()); + } + + @Test + @DisplayName("Корректное заполнение answer3") + public void fillAnswer3AnsweTest() { + assertEquals(c_answer3, question.getAnswer3()); + } + + @Test + @DisplayName("Корректное заполнение answer4") + public void fillAnswer4AnsweTest() { + assertEquals(c_answer4, question.getAnswer4()); + } +} \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/model/UserTest.java b/src/test/java/ru/otus/mkulikov/model/UserTest.java new file mode 100644 index 0000000..ffba44b --- /dev/null +++ b/src/test/java/ru/otus/mkulikov/model/UserTest.java @@ -0,0 +1,33 @@ +package ru.otus.mkulikov.model; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 2019-03-18 + * Time: 10:57 + */ + +@DisplayName("Класс User") +class UserTest { + + private final String c_userName = "Name"; + private final String c_userSurname = "Surname"; + + @Test + @DisplayName("Корректное создание") + public void createUserTest() { + User user = new User(c_userName, c_userSurname); + assertAll("user", + () -> assertEquals(c_userName, user.getName()), + () -> assertEquals(c_userSurname, user.getSurname()) + ); + + Assertions.assertThat(user).hasFieldOrPropertyWithValue("name", c_userName); + } +} \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/processor/ProcessorServiceImplTest.java b/src/test/java/ru/otus/mkulikov/processor/ProcessorServiceImplTest.java new file mode 100644 index 0000000..c5f2864 --- /dev/null +++ b/src/test/java/ru/otus/mkulikov/processor/ProcessorServiceImplTest.java @@ -0,0 +1,56 @@ +package ru.otus.mkulikov.processor; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; + +import static org.junit.jupiter.api.Assertions.*; +import static ru.otus.mkulikov.constants.StringConstants.c_error_load_questionsService; +import static ru.otus.mkulikov.constants.StringConstants.c_error_load_registrationService; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 2019-03-18 + * Time: 11:37 + */ + +@DisplayName("Класс ProcessorServiceImpl") +class ProcessorServiceImplTest { + + private final ProcessorServiceImpl processorServiceNull = new ProcessorServiceImpl(null, null); + + @Test + @DisplayName("Корректный тип исключения для getQuestionsProcess") + void getExceptionTypeQuestionsProcessTest() { + assertThrows(QuestionsFileLoadingException.class, () -> { + processorServiceNull.getQuestionsService(); + }); + } + + @Test + @DisplayName("Корректное исключение для getQuestionsProcess") + void getExceptionQuestionsProcessTest() { + Throwable exception = assertThrows(QuestionsFileLoadingException.class, () -> { + processorServiceNull.getQuestionsService(); + }); + assertEquals(c_error_load_questionsService, exception.getMessage()); + } + + @Test + @DisplayName("Корректный тип исключения для getRegistrationTest") + void getExceptionTypeRegistrationTest() { + assertThrows(QuestionsFileLoadingException.class, () -> { + processorServiceNull.getRegistration(); + }); + } + + @Test + @DisplayName("Корректное исключение для getRegistrationTest") + void getExceptionRegistrationTest() { + Throwable exception = assertThrows(QuestionsFileLoadingException.class, () -> { + processorServiceNull.getRegistration(); + }); + assertEquals(c_error_load_registrationService, exception.getMessage()); + } +} \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java b/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java index 19c5d55..9c68433 100644 --- a/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java +++ b/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java @@ -1,31 +1,57 @@ package ru.otus.mkulikov.questions; +import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; import ru.otus.mkulikov.model.Question; import java.util.List; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.*; +@DisplayName("Класс QuestionsDAO") class QuestionsDAOTest { - private final String c_questionsFileName = "questions.csv"; + private final QuestionsDAO questionsDAO = new QuestionsDAOImpl(); + + private final String c_questionsFileName = "test_questions.csv"; + private final String c_questionsBadFileName = "test.csv"; + + private final String c_test1 = "Тест1"; + private final String c_test2 = "Тест2"; + private final String c_test3 = "Тест3"; @Test + @DisplayName("Корректная загрузка вопросов") public void loadQuestionsTest() { try { - QuestionsDAO questionsDAO = new QuestionsDAOImpl(); List questions = questionsDAO.getQuestions(c_questionsFileName); assertNotNull(questions); - assertEquals(questions.size(), 3); - assertEquals(questions.get(0).getQuestion(), "Тест1"); - assertEquals(questions.get(1).getQuestion(), "Тест2"); - assertEquals(questions.get(2).getQuestion(), "Тест3"); + assertEquals(3, questions.size()); + assertEquals(c_test1, questions.get(0).getQuestion()); + assertEquals(c_test2, questions.get(1).getQuestion()); + assertEquals(c_test3, questions.get(2).getQuestion()); } catch (QuestionsFileLoadingException e) { e.printStackTrace(); } } + + @Test + @DisplayName("Корректное исключение на null") + public void loadNullExceptionQuestionsTest() { + Throwable exception = assertThrows(QuestionsFileLoadingException.class, () -> { + questionsDAO.getQuestions(null); + }); + assertEquals("Имя файла не может быть null!", exception.getMessage()); + } + + @Test + @DisplayName("Корректное исключение на неверное имя файла") + public void loadExceptionQuestionsTest() { + Throwable exception = assertThrows(QuestionsFileLoadingException.class, () -> { + questionsDAO.getQuestions(c_questionsBadFileName); + }); + assertEquals(String.format("Ошибка загрузки ресурса с именем %s!", c_questionsBadFileName), exception.getMessage()); + } } \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/questions/QuestionsServiceImplTest.java b/src/test/java/ru/otus/mkulikov/questions/QuestionsServiceImplTest.java new file mode 100644 index 0000000..a7bbcc6 --- /dev/null +++ b/src/test/java/ru/otus/mkulikov/questions/QuestionsServiceImplTest.java @@ -0,0 +1,56 @@ +package ru.otus.mkulikov.questions; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; + +import static org.junit.jupiter.api.Assertions.*; +import static ru.otus.mkulikov.constants.StringConstants.c_error_load_consoleService; +import static ru.otus.mkulikov.constants.StringConstants.c_error_load_questionsDAO; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 2019-03-18 + * Time: 12:00 + */ + +@DisplayName("Класс QuestionsServiceImpl") +class QuestionsServiceImplTest { + + private final QuestionsServiceImpl questionsService = new QuestionsServiceImpl(null, null); + + @Test + @DisplayName("Корректный тип исключения для getQuestionsDAO") + void getExceptionTypeQuestionsDAO() { + assertThrows(QuestionsFileLoadingException.class, () -> { + questionsService.getQuestionsDAO(); + }); + } + + @Test + @DisplayName("Корректное исключение для getQuestionsDAO") + void getExceptionQuestionsDAO() { + Throwable exception = assertThrows(QuestionsFileLoadingException.class, () -> { + questionsService.getQuestionsDAO(); + }); + assertEquals(c_error_load_questionsDAO, exception.getMessage()); + } + + @Test + @DisplayName("Корректный тип исключения для getConsoleService") + void getExceptionTypeConsoleService() { + assertThrows(QuestionsFileLoadingException.class, () -> { + questionsService.getConsoleService(); + }); + } + + @Test + @DisplayName("Корректное исключение для getConsoleService") + void getExceptionConsoleService() { + Throwable exception = assertThrows(QuestionsFileLoadingException.class, () -> { + questionsService.getConsoleService(); + }); + assertEquals(c_error_load_consoleService, exception.getMessage()); + } +} \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/registration/RegistrationServiceImplTest.java b/src/test/java/ru/otus/mkulikov/registration/RegistrationServiceImplTest.java new file mode 100644 index 0000000..5b75555 --- /dev/null +++ b/src/test/java/ru/otus/mkulikov/registration/RegistrationServiceImplTest.java @@ -0,0 +1,38 @@ +package ru.otus.mkulikov.registration; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; + +import static org.junit.jupiter.api.Assertions.*; +import static ru.otus.mkulikov.constants.StringConstants.c_error_load_consoleService; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 2019-03-18 + * Time: 13:02 + */ + +@DisplayName("Класс RegistrationServiceImpl") +class RegistrationServiceImplTest { + + private final RegistrationServiceImpl registrationService = new RegistrationServiceImpl(null); + + @Test + @DisplayName("Корректный тип исключения для getConsoleService") + void getExceptionTypeConsoleServiceTest() { + assertThrows(QuestionsFileLoadingException.class, () -> { + registrationService.getConsoleService(); + }); + } + + @Test + @DisplayName("Корректное исключение для getQuestionsDAO") + void getExceptionConsoleServiceTest() { + Throwable exception = assertThrows(QuestionsFileLoadingException.class, () -> { + registrationService.getConsoleService(); + }); + assertEquals(c_error_load_consoleService, exception.getMessage()); + } +} \ No newline at end of file diff --git a/src/test/resources/test_questions.csv b/src/test/resources/test_questions.csv new file mode 100644 index 0000000..47cc49f --- /dev/null +++ b/src/test/resources/test_questions.csv @@ -0,0 +1,3 @@ +1,Тест1,Ответ1,Ответ2,Ответ3,Ответ4,Ответ1 +2,Тест2,Ответ1,Ответ2,Ответ3,Ответ4,Ответ1 +3,Тест3,Ответ1,Ответ2,Ответ3,Ответ4,Ответ1 From f02aaa198e5cb3181e6f9e71fc03df67cf308ad1 Mon Sep 17 00:00:00 2001 From: "maxim.kulikov" Date: Tue, 19 Mar 2019 16:19:34 +0300 Subject: [PATCH 07/15] =?UTF-8?q?-=20XML=20=D0=BA=D0=BE=D0=BD=D1=84=D0=B8?= =?UTF-8?q?=D0=B3=D1=83=D1=80=D0=B0=D1=86=D0=B8=D1=8F=20spring=20=D0=B7?= =?UTF-8?q?=D0=B0=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B0=20=D0=BD=D0=B0=20Jav?= =?UTF-8?q?a-based.=20-=20=D0=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=B2=20=D1=81=D1=82=D1=80=D1=83=D0=BA=D1=82=D1=83?= =?UTF-8?q?=D1=80=D0=B5=20=D1=84=D0=B0=D0=B9=D0=BB=D0=BE=D0=B2.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 19 ++++--- pom.xml | 22 +++++++- .../mkulikov/{Main.java => Application.java} | 12 ++-- .../mkulikov/configuration/AppConfig.java | 56 +++++++++++++++++++ .../mkulikov/{model => models}/Question.java | 2 +- .../otus/mkulikov/{model => models}/User.java | 2 +- .../console/ConsoleService.java | 2 +- .../console/ConsoleServiceImpl.java | 2 +- .../processor/ProcessorService.java | 2 +- .../processor/ProcessorServiceImpl.java | 6 +- .../questions/QuestionsService.java | 2 +- .../questions/QuestionsServiceImpl.java | 7 ++- .../questions/dao}/QuestionsDAO.java | 4 +- .../questions/dao}/QuestionsDAOImpl.java | 14 ++--- .../registration/RegistrationService.java | 2 +- .../registration/RegistrationServiceImpl.java | 6 +- src/main/resources/applicationContext.xml | 24 -------- .../ru/otus/mkulikov/model/QuestionTest.java | 1 + .../java/ru/otus/mkulikov/model/UserTest.java | 1 + .../processor/ProcessorServiceImplTest.java | 1 + .../mkulikov/questions/QuestionsDAOTest.java | 16 ++++-- .../questions/QuestionsServiceImplTest.java | 1 + .../RegistrationServiceImplTest.java | 1 + src/test/resources/questions.csv | 3 - 24 files changed, 134 insertions(+), 74 deletions(-) rename src/main/java/ru/otus/mkulikov/{Main.java => Application.java} (54%) create mode 100644 src/main/java/ru/otus/mkulikov/configuration/AppConfig.java rename src/main/java/ru/otus/mkulikov/{model => models}/Question.java (98%) rename src/main/java/ru/otus/mkulikov/{model => models}/User.java (94%) rename src/main/java/ru/otus/mkulikov/{ => services}/console/ConsoleService.java (81%) rename src/main/java/ru/otus/mkulikov/{ => services}/console/ConsoleServiceImpl.java (93%) rename src/main/java/ru/otus/mkulikov/{ => services}/processor/ProcessorService.java (85%) rename src/main/java/ru/otus/mkulikov/{ => services}/processor/ProcessorServiceImpl.java (89%) rename src/main/java/ru/otus/mkulikov/{ => services}/questions/QuestionsService.java (85%) rename src/main/java/ru/otus/mkulikov/{ => services}/questions/QuestionsServiceImpl.java (93%) rename src/main/java/ru/otus/mkulikov/{questions => services/questions/dao}/QuestionsDAO.java (77%) rename src/main/java/ru/otus/mkulikov/{questions => services/questions/dao}/QuestionsDAOImpl.java (88%) rename src/main/java/ru/otus/mkulikov/{ => services}/registration/RegistrationService.java (85%) rename src/main/java/ru/otus/mkulikov/{ => services}/registration/RegistrationServiceImpl.java (90%) delete mode 100644 src/main/resources/applicationContext.xml delete mode 100644 src/test/resources/questions.csv diff --git a/README.md b/README.md index 10840c6..893eb6e 100644 --- a/README.md +++ b/README.md @@ -1,20 +1,23 @@ # OtusSpringHW -Домашнее задание #1: - +### Домашнее задание #1: Программа по проведению тестирования студентов -В ресурсах хранятся вопросы и различные ответы к ним в виде CSV файла (5 вопрсов). Программа должна спросить у пользователя фамилию и имя, спросить 5 вопросов из CSV-файла и вывести результат тестирования. - +В ресурсах хранятся вопросы и различные ответы к ним в виде CSV файла (5 вопросов). Программа должна спросить у пользователя фамилию и имя, спросить 5 вопросов из CSV-файла и вывести результат тестирования. Все сервисы в программе должны решать строго определённую задачу. Зависимости должны быть настроены в IoC контейнере. - Опционально: сервисы, по возможности, покрыть тестами. -### 19-03-18 Доработки: +##### 19-03-18 Доработки: - Переименованы классы. - Добавлено исключение QuestionsFileLoadingException. - Работа с консолью вынесена в сервис ConsoleService. - Тесты для QuestionsDAO. -### 19-03-19 Доработки: +##### 19-03-19 Доработки: - Переименованы классы. -- Добавлены тесты. \ No newline at end of file +- Добавлены тесты. +--- +### Домашнее задание #2: +- Добавить файл настроек в приложение и для тестирования. +- Локализовать выводимые сообщения и вопросы теста. +- Переписать конфигурацию в виде Java + Annotation-based конфигурации. +--- \ No newline at end of file diff --git a/pom.xml b/pom.xml index 942e1cb..bb61d64 100644 --- a/pom.xml +++ b/pom.xml @@ -36,6 +36,13 @@ 1.3.2 + + junit + junit + 4.12 + test + + org.junit.jupiter junit-jupiter-api @@ -56,6 +63,13 @@ 3.11.1 test + + + org.junit.platform + junit-platform-launcher + 1.4.1 + test + @@ -81,7 +95,11 @@ org.apache.maven.plugins maven-surefire-plugin - 2.21.0 + 2.22.0 + + + false + @@ -89,8 +107,6 @@ src/main/resources - **/*.properties - **/*.xml **/*.csv false diff --git a/src/main/java/ru/otus/mkulikov/Main.java b/src/main/java/ru/otus/mkulikov/Application.java similarity index 54% rename from src/main/java/ru/otus/mkulikov/Main.java rename to src/main/java/ru/otus/mkulikov/Application.java index 88e4918..c6a283c 100644 --- a/src/main/java/ru/otus/mkulikov/Main.java +++ b/src/main/java/ru/otus/mkulikov/Application.java @@ -1,8 +1,10 @@ package ru.otus.mkulikov; -import org.springframework.context.support.ClassPathXmlApplicationContext; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; -import ru.otus.mkulikov.processor.ProcessorService; +import ru.otus.mkulikov.services.processor.ProcessorService; /** * Created by IntelliJ IDEA. @@ -11,10 +13,12 @@ * Time: 15:27 */ -public class Main { +@Configuration +@ComponentScan +public class Application { public static void main(String[] args) { - ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); + AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Application.class); try { ProcessorService processor = context.getBean(ProcessorService.class); processor.startTest(); diff --git a/src/main/java/ru/otus/mkulikov/configuration/AppConfig.java b/src/main/java/ru/otus/mkulikov/configuration/AppConfig.java new file mode 100644 index 0000000..dcb8799 --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/configuration/AppConfig.java @@ -0,0 +1,56 @@ +package ru.otus.mkulikov.configuration; + +import org.springframework.beans.factory.config.ConfigurableBeanFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Scope; +import ru.otus.mkulikov.services.questions.dao.QuestionsDAO; +import ru.otus.mkulikov.services.questions.dao.QuestionsDAOImpl; +import ru.otus.mkulikov.services.console.ConsoleService; +import ru.otus.mkulikov.services.console.ConsoleServiceImpl; +import ru.otus.mkulikov.services.processor.ProcessorServiceImpl; +import ru.otus.mkulikov.services.questions.QuestionsService; +import ru.otus.mkulikov.services.questions.QuestionsServiceImpl; +import ru.otus.mkulikov.services.registration.RegistrationService; +import ru.otus.mkulikov.services.registration.RegistrationServiceImpl; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 2019-03-19 + * Time: 14:15 + */ + +@Configuration +public class AppConfig { + + @Bean(destroyMethod = "destroy") + @Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON) + public ConsoleServiceImpl consoleService() { + return new ConsoleServiceImpl(); + } + + @Bean + @Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE) + public RegistrationServiceImpl registrationService(ConsoleService consoleService) { + return new RegistrationServiceImpl(consoleService); + } + + @Bean + @Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE) + public QuestionsDAOImpl questionsDAO() { + return new QuestionsDAOImpl(); + } + + @Bean + @Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON) + public QuestionsServiceImpl questionsService(QuestionsDAO questionsDAO, ConsoleService consoleService) { + return new QuestionsServiceImpl(questionsDAO, consoleService); + } + + @Bean + @Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON) + public ProcessorServiceImpl processorService(QuestionsService questionsService, RegistrationService registrationService) { + return new ProcessorServiceImpl(questionsService, registrationService); + } +} \ No newline at end of file diff --git a/src/main/java/ru/otus/mkulikov/model/Question.java b/src/main/java/ru/otus/mkulikov/models/Question.java similarity index 98% rename from src/main/java/ru/otus/mkulikov/model/Question.java rename to src/main/java/ru/otus/mkulikov/models/Question.java index 5f40e3f..94ca74c 100644 --- a/src/main/java/ru/otus/mkulikov/model/Question.java +++ b/src/main/java/ru/otus/mkulikov/models/Question.java @@ -1,4 +1,4 @@ -package ru.otus.mkulikov.model; +package ru.otus.mkulikov.models; import java.io.Serializable; diff --git a/src/main/java/ru/otus/mkulikov/model/User.java b/src/main/java/ru/otus/mkulikov/models/User.java similarity index 94% rename from src/main/java/ru/otus/mkulikov/model/User.java rename to src/main/java/ru/otus/mkulikov/models/User.java index 146fbd7..bb44f31 100644 --- a/src/main/java/ru/otus/mkulikov/model/User.java +++ b/src/main/java/ru/otus/mkulikov/models/User.java @@ -1,4 +1,4 @@ -package ru.otus.mkulikov.model; +package ru.otus.mkulikov.models; /** * Created by IntelliJ IDEA. diff --git a/src/main/java/ru/otus/mkulikov/console/ConsoleService.java b/src/main/java/ru/otus/mkulikov/services/console/ConsoleService.java similarity index 81% rename from src/main/java/ru/otus/mkulikov/console/ConsoleService.java rename to src/main/java/ru/otus/mkulikov/services/console/ConsoleService.java index 75d552d..a7e2f25 100644 --- a/src/main/java/ru/otus/mkulikov/console/ConsoleService.java +++ b/src/main/java/ru/otus/mkulikov/services/console/ConsoleService.java @@ -1,4 +1,4 @@ -package ru.otus.mkulikov.console; +package ru.otus.mkulikov.services.console; /** * Created by IntelliJ IDEA. diff --git a/src/main/java/ru/otus/mkulikov/console/ConsoleServiceImpl.java b/src/main/java/ru/otus/mkulikov/services/console/ConsoleServiceImpl.java similarity index 93% rename from src/main/java/ru/otus/mkulikov/console/ConsoleServiceImpl.java rename to src/main/java/ru/otus/mkulikov/services/console/ConsoleServiceImpl.java index 881223e..7a0c2d0 100644 --- a/src/main/java/ru/otus/mkulikov/console/ConsoleServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/services/console/ConsoleServiceImpl.java @@ -1,4 +1,4 @@ -package ru.otus.mkulikov.console; +package ru.otus.mkulikov.services.console; import javax.annotation.PreDestroy; import java.util.Scanner; diff --git a/src/main/java/ru/otus/mkulikov/processor/ProcessorService.java b/src/main/java/ru/otus/mkulikov/services/processor/ProcessorService.java similarity index 85% rename from src/main/java/ru/otus/mkulikov/processor/ProcessorService.java rename to src/main/java/ru/otus/mkulikov/services/processor/ProcessorService.java index f0bcccc..54e3c71 100644 --- a/src/main/java/ru/otus/mkulikov/processor/ProcessorService.java +++ b/src/main/java/ru/otus/mkulikov/services/processor/ProcessorService.java @@ -1,4 +1,4 @@ -package ru.otus.mkulikov.processor; +package ru.otus.mkulikov.services.processor; import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; diff --git a/src/main/java/ru/otus/mkulikov/processor/ProcessorServiceImpl.java b/src/main/java/ru/otus/mkulikov/services/processor/ProcessorServiceImpl.java similarity index 89% rename from src/main/java/ru/otus/mkulikov/processor/ProcessorServiceImpl.java rename to src/main/java/ru/otus/mkulikov/services/processor/ProcessorServiceImpl.java index 626be7a..80905f6 100644 --- a/src/main/java/ru/otus/mkulikov/processor/ProcessorServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/services/processor/ProcessorServiceImpl.java @@ -1,8 +1,8 @@ -package ru.otus.mkulikov.processor; +package ru.otus.mkulikov.services.processor; import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; -import ru.otus.mkulikov.questions.QuestionsService; -import ru.otus.mkulikov.registration.RegistrationService; +import ru.otus.mkulikov.services.questions.QuestionsService; +import ru.otus.mkulikov.services.registration.RegistrationService; import static ru.otus.mkulikov.constants.StringConstants.c_error_load_questionsService; import static ru.otus.mkulikov.constants.StringConstants.c_error_load_registrationService; diff --git a/src/main/java/ru/otus/mkulikov/questions/QuestionsService.java b/src/main/java/ru/otus/mkulikov/services/questions/QuestionsService.java similarity index 85% rename from src/main/java/ru/otus/mkulikov/questions/QuestionsService.java rename to src/main/java/ru/otus/mkulikov/services/questions/QuestionsService.java index 8c80904..15fd4bb 100644 --- a/src/main/java/ru/otus/mkulikov/questions/QuestionsService.java +++ b/src/main/java/ru/otus/mkulikov/services/questions/QuestionsService.java @@ -1,4 +1,4 @@ -package ru.otus.mkulikov.questions; +package ru.otus.mkulikov.services.questions; import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; diff --git a/src/main/java/ru/otus/mkulikov/questions/QuestionsServiceImpl.java b/src/main/java/ru/otus/mkulikov/services/questions/QuestionsServiceImpl.java similarity index 93% rename from src/main/java/ru/otus/mkulikov/questions/QuestionsServiceImpl.java rename to src/main/java/ru/otus/mkulikov/services/questions/QuestionsServiceImpl.java index fe5c66d..68acf83 100644 --- a/src/main/java/ru/otus/mkulikov/questions/QuestionsServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/services/questions/QuestionsServiceImpl.java @@ -1,8 +1,9 @@ -package ru.otus.mkulikov.questions; +package ru.otus.mkulikov.services.questions; -import ru.otus.mkulikov.console.ConsoleService; +import ru.otus.mkulikov.services.console.ConsoleService; import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; -import ru.otus.mkulikov.model.Question; +import ru.otus.mkulikov.services.questions.dao.QuestionsDAO; +import ru.otus.mkulikov.models.Question; import java.util.List; diff --git a/src/main/java/ru/otus/mkulikov/questions/QuestionsDAO.java b/src/main/java/ru/otus/mkulikov/services/questions/dao/QuestionsDAO.java similarity index 77% rename from src/main/java/ru/otus/mkulikov/questions/QuestionsDAO.java rename to src/main/java/ru/otus/mkulikov/services/questions/dao/QuestionsDAO.java index 9a99d97..c2c08b3 100644 --- a/src/main/java/ru/otus/mkulikov/questions/QuestionsDAO.java +++ b/src/main/java/ru/otus/mkulikov/services/questions/dao/QuestionsDAO.java @@ -1,7 +1,7 @@ -package ru.otus.mkulikov.questions; +package ru.otus.mkulikov.services.questions.dao; import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; -import ru.otus.mkulikov.model.Question; +import ru.otus.mkulikov.models.Question; import java.util.List; diff --git a/src/main/java/ru/otus/mkulikov/questions/QuestionsDAOImpl.java b/src/main/java/ru/otus/mkulikov/services/questions/dao/QuestionsDAOImpl.java similarity index 88% rename from src/main/java/ru/otus/mkulikov/questions/QuestionsDAOImpl.java rename to src/main/java/ru/otus/mkulikov/services/questions/dao/QuestionsDAOImpl.java index 1ec9636..2e9fcb2 100644 --- a/src/main/java/ru/otus/mkulikov/questions/QuestionsDAOImpl.java +++ b/src/main/java/ru/otus/mkulikov/services/questions/dao/QuestionsDAOImpl.java @@ -1,15 +1,12 @@ -package ru.otus.mkulikov.questions; +package ru.otus.mkulikov.services.questions.dao; import au.com.bytecode.opencsv.CSVReader; import au.com.bytecode.opencsv.bean.ColumnPositionMappingStrategy; import au.com.bytecode.opencsv.bean.CsvToBean; import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; -import ru.otus.mkulikov.model.Question; +import ru.otus.mkulikov.models.Question; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.net.URI; +import java.io.*; import java.net.URISyntaxException; import java.net.URL; import java.util.List; @@ -39,8 +36,7 @@ private List loadFile(String csvFilename) throws QuestionsFileLoadingE } File file = new File(url.toURI()); - - CSVReader csvReader = new CSVReader(new FileReader(file)); + CSVReader csvReader=new CSVReader(new InputStreamReader(new FileInputStream(file), "UTF-8")); CsvToBean csv = new CsvToBean(); questions = csv.parse(setColumMapping(), csvReader); @@ -48,6 +44,8 @@ private List loadFile(String csvFilename) throws QuestionsFileLoadingE throw new QuestionsFileLoadingException("Файл с именем " + csvFilename + " не найден!", e); } catch (URISyntaxException e) { throw new QuestionsFileLoadingException("Ошибка чтения файла!", e); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); } return questions; } diff --git a/src/main/java/ru/otus/mkulikov/registration/RegistrationService.java b/src/main/java/ru/otus/mkulikov/services/registration/RegistrationService.java similarity index 85% rename from src/main/java/ru/otus/mkulikov/registration/RegistrationService.java rename to src/main/java/ru/otus/mkulikov/services/registration/RegistrationService.java index f3a68ea..8b6d68e 100644 --- a/src/main/java/ru/otus/mkulikov/registration/RegistrationService.java +++ b/src/main/java/ru/otus/mkulikov/services/registration/RegistrationService.java @@ -1,4 +1,4 @@ -package ru.otus.mkulikov.registration; +package ru.otus.mkulikov.services.registration; import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; diff --git a/src/main/java/ru/otus/mkulikov/registration/RegistrationServiceImpl.java b/src/main/java/ru/otus/mkulikov/services/registration/RegistrationServiceImpl.java similarity index 90% rename from src/main/java/ru/otus/mkulikov/registration/RegistrationServiceImpl.java rename to src/main/java/ru/otus/mkulikov/services/registration/RegistrationServiceImpl.java index b50d935..2c70448 100644 --- a/src/main/java/ru/otus/mkulikov/registration/RegistrationServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/services/registration/RegistrationServiceImpl.java @@ -1,8 +1,8 @@ -package ru.otus.mkulikov.registration; +package ru.otus.mkulikov.services.registration; -import ru.otus.mkulikov.console.ConsoleService; +import ru.otus.mkulikov.services.console.ConsoleService; import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; -import ru.otus.mkulikov.model.User; +import ru.otus.mkulikov.models.User; import static ru.otus.mkulikov.constants.StringConstants.c_error_load_consoleService; diff --git a/src/main/resources/applicationContext.xml b/src/main/resources/applicationContext.xml deleted file mode 100644 index c85fd3c..0000000 --- a/src/main/resources/applicationContext.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/model/QuestionTest.java b/src/test/java/ru/otus/mkulikov/model/QuestionTest.java index c7a8c27..fd315d2 100644 --- a/src/test/java/ru/otus/mkulikov/model/QuestionTest.java +++ b/src/test/java/ru/otus/mkulikov/model/QuestionTest.java @@ -3,6 +3,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import ru.otus.mkulikov.models.Question; import static org.junit.jupiter.api.Assertions.assertEquals; diff --git a/src/test/java/ru/otus/mkulikov/model/UserTest.java b/src/test/java/ru/otus/mkulikov/model/UserTest.java index ffba44b..b1982fe 100644 --- a/src/test/java/ru/otus/mkulikov/model/UserTest.java +++ b/src/test/java/ru/otus/mkulikov/model/UserTest.java @@ -3,6 +3,7 @@ import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import ru.otus.mkulikov.models.User; import static org.junit.jupiter.api.Assertions.*; diff --git a/src/test/java/ru/otus/mkulikov/processor/ProcessorServiceImplTest.java b/src/test/java/ru/otus/mkulikov/processor/ProcessorServiceImplTest.java index c5f2864..2928f53 100644 --- a/src/test/java/ru/otus/mkulikov/processor/ProcessorServiceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/processor/ProcessorServiceImplTest.java @@ -3,6 +3,7 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; +import ru.otus.mkulikov.services.processor.ProcessorServiceImpl; import static org.junit.jupiter.api.Assertions.*; import static ru.otus.mkulikov.constants.StringConstants.c_error_load_questionsService; diff --git a/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java b/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java index 9c68433..0ba967c 100644 --- a/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java +++ b/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java @@ -3,7 +3,9 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; -import ru.otus.mkulikov.model.Question; +import ru.otus.mkulikov.models.Question; +import ru.otus.mkulikov.services.questions.dao.QuestionsDAO; +import ru.otus.mkulikov.services.questions.dao.QuestionsDAOImpl; import java.util.List; @@ -27,11 +29,13 @@ public void loadQuestionsTest() { try { List questions = questionsDAO.getQuestions(c_questionsFileName); - assertNotNull(questions); - assertEquals(3, questions.size()); - assertEquals(c_test1, questions.get(0).getQuestion()); - assertEquals(c_test2, questions.get(1).getQuestion()); - assertEquals(c_test3, questions.get(2).getQuestion()); + assertAll("questions", + () -> assertNotNull(questions), + () -> assertEquals(3, questions.size()), + () -> assertEquals(c_test1, questions.get(0).getQuestion()), + () -> assertEquals(c_test2, questions.get(1).getQuestion()), + () -> assertEquals(c_test3, questions.get(2).getQuestion()) + ); } catch (QuestionsFileLoadingException e) { e.printStackTrace(); } diff --git a/src/test/java/ru/otus/mkulikov/questions/QuestionsServiceImplTest.java b/src/test/java/ru/otus/mkulikov/questions/QuestionsServiceImplTest.java index a7bbcc6..2935fc0 100644 --- a/src/test/java/ru/otus/mkulikov/questions/QuestionsServiceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/questions/QuestionsServiceImplTest.java @@ -3,6 +3,7 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; +import ru.otus.mkulikov.services.questions.QuestionsServiceImpl; import static org.junit.jupiter.api.Assertions.*; import static ru.otus.mkulikov.constants.StringConstants.c_error_load_consoleService; diff --git a/src/test/java/ru/otus/mkulikov/registration/RegistrationServiceImplTest.java b/src/test/java/ru/otus/mkulikov/registration/RegistrationServiceImplTest.java index 5b75555..0252a9d 100644 --- a/src/test/java/ru/otus/mkulikov/registration/RegistrationServiceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/registration/RegistrationServiceImplTest.java @@ -3,6 +3,7 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; +import ru.otus.mkulikov.services.registration.RegistrationServiceImpl; import static org.junit.jupiter.api.Assertions.*; import static ru.otus.mkulikov.constants.StringConstants.c_error_load_consoleService; diff --git a/src/test/resources/questions.csv b/src/test/resources/questions.csv deleted file mode 100644 index 47cc49f..0000000 --- a/src/test/resources/questions.csv +++ /dev/null @@ -1,3 +0,0 @@ -1,Тест1,Ответ1,Ответ2,Ответ3,Ответ4,Ответ1 -2,Тест2,Ответ1,Ответ2,Ответ3,Ответ4,Ответ1 -3,Тест3,Ответ1,Ответ2,Ответ3,Ответ4,Ответ1 From 0c0054193afa0ee39bf733621314badab2a236de Mon Sep 17 00:00:00 2001 From: "maxim.kulikov" Date: Tue, 19 Mar 2019 16:44:44 +0300 Subject: [PATCH 08/15] =?UTF-8?q?Java-based=20=D0=BA=D0=BE=D0=BD=D1=84?= =?UTF-8?q?=D0=B8=D0=B3=D1=83=D1=80=D0=B0=D1=86=D0=B8=D1=8F=20spring=20?= =?UTF-8?q?=D0=B7=D0=B0=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B0=20=D0=BD=D0=B0?= =?UTF-8?q?=20Annotation-based.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mkulikov/configuration/AppConfig.java | 56 ------------------- .../services/console/ConsoleServiceImpl.java | 5 +- .../processor/ProcessorServiceImpl.java | 8 ++- .../questions/QuestionsServiceImpl.java | 12 ++-- .../questions/dao/QuestionsDAOImpl.java | 2 + .../registration/RegistrationServiceImpl.java | 8 ++- 6 files changed, 26 insertions(+), 65 deletions(-) delete mode 100644 src/main/java/ru/otus/mkulikov/configuration/AppConfig.java diff --git a/src/main/java/ru/otus/mkulikov/configuration/AppConfig.java b/src/main/java/ru/otus/mkulikov/configuration/AppConfig.java deleted file mode 100644 index dcb8799..0000000 --- a/src/main/java/ru/otus/mkulikov/configuration/AppConfig.java +++ /dev/null @@ -1,56 +0,0 @@ -package ru.otus.mkulikov.configuration; - -import org.springframework.beans.factory.config.ConfigurableBeanFactory; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Scope; -import ru.otus.mkulikov.services.questions.dao.QuestionsDAO; -import ru.otus.mkulikov.services.questions.dao.QuestionsDAOImpl; -import ru.otus.mkulikov.services.console.ConsoleService; -import ru.otus.mkulikov.services.console.ConsoleServiceImpl; -import ru.otus.mkulikov.services.processor.ProcessorServiceImpl; -import ru.otus.mkulikov.services.questions.QuestionsService; -import ru.otus.mkulikov.services.questions.QuestionsServiceImpl; -import ru.otus.mkulikov.services.registration.RegistrationService; -import ru.otus.mkulikov.services.registration.RegistrationServiceImpl; - -/** - * Created by IntelliJ IDEA. - * Developer: Maksim Kulikov - * Date: 2019-03-19 - * Time: 14:15 - */ - -@Configuration -public class AppConfig { - - @Bean(destroyMethod = "destroy") - @Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON) - public ConsoleServiceImpl consoleService() { - return new ConsoleServiceImpl(); - } - - @Bean - @Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE) - public RegistrationServiceImpl registrationService(ConsoleService consoleService) { - return new RegistrationServiceImpl(consoleService); - } - - @Bean - @Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE) - public QuestionsDAOImpl questionsDAO() { - return new QuestionsDAOImpl(); - } - - @Bean - @Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON) - public QuestionsServiceImpl questionsService(QuestionsDAO questionsDAO, ConsoleService consoleService) { - return new QuestionsServiceImpl(questionsDAO, consoleService); - } - - @Bean - @Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON) - public ProcessorServiceImpl processorService(QuestionsService questionsService, RegistrationService registrationService) { - return new ProcessorServiceImpl(questionsService, registrationService); - } -} \ No newline at end of file diff --git a/src/main/java/ru/otus/mkulikov/services/console/ConsoleServiceImpl.java b/src/main/java/ru/otus/mkulikov/services/console/ConsoleServiceImpl.java index 7a0c2d0..357b770 100644 --- a/src/main/java/ru/otus/mkulikov/services/console/ConsoleServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/services/console/ConsoleServiceImpl.java @@ -1,5 +1,7 @@ package ru.otus.mkulikov.services.console; +import org.springframework.stereotype.Service; + import javax.annotation.PreDestroy; import java.util.Scanner; @@ -10,9 +12,10 @@ * Time: 23:21 */ +@Service public class ConsoleServiceImpl implements ConsoleService { - private Scanner in; + private final Scanner in; public ConsoleServiceImpl() { in = new Scanner(System.in); diff --git a/src/main/java/ru/otus/mkulikov/services/processor/ProcessorServiceImpl.java b/src/main/java/ru/otus/mkulikov/services/processor/ProcessorServiceImpl.java index 80905f6..f398f9c 100644 --- a/src/main/java/ru/otus/mkulikov/services/processor/ProcessorServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/services/processor/ProcessorServiceImpl.java @@ -1,5 +1,7 @@ package ru.otus.mkulikov.services.processor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; import ru.otus.mkulikov.services.questions.QuestionsService; import ru.otus.mkulikov.services.registration.RegistrationService; @@ -14,11 +16,13 @@ * Time: 15:54 */ +@Service public class ProcessorServiceImpl implements ProcessorService { - private QuestionsService questionsService; - private RegistrationService registration; + private final QuestionsService questionsService; + private final RegistrationService registration; + @Autowired public ProcessorServiceImpl(QuestionsService questionsService, RegistrationService registration) { this.questionsService = questionsService; this.registration = registration; diff --git a/src/main/java/ru/otus/mkulikov/services/questions/QuestionsServiceImpl.java b/src/main/java/ru/otus/mkulikov/services/questions/QuestionsServiceImpl.java index 68acf83..c749537 100644 --- a/src/main/java/ru/otus/mkulikov/services/questions/QuestionsServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/services/questions/QuestionsServiceImpl.java @@ -1,9 +1,11 @@ package ru.otus.mkulikov.services.questions; -import ru.otus.mkulikov.services.console.ConsoleService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; -import ru.otus.mkulikov.services.questions.dao.QuestionsDAO; import ru.otus.mkulikov.models.Question; +import ru.otus.mkulikov.services.console.ConsoleService; +import ru.otus.mkulikov.services.questions.dao.QuestionsDAO; import java.util.List; @@ -17,15 +19,17 @@ * Time: 16:41 */ +@Service public class QuestionsServiceImpl implements QuestionsService { private final String c_delimeter = "---------------------------------------------------"; private final String c_answerNumbers = "1234"; private final String c_questionsFileName = "questions.csv"; - private QuestionsDAO questionsDAO; - private ConsoleService consoleService; + private final QuestionsDAO questionsDAO; + private final ConsoleService consoleService; + @Autowired public QuestionsServiceImpl(QuestionsDAO questionsDAO, ConsoleService consoleService) { this.questionsDAO = questionsDAO; this.consoleService = consoleService; diff --git a/src/main/java/ru/otus/mkulikov/services/questions/dao/QuestionsDAOImpl.java b/src/main/java/ru/otus/mkulikov/services/questions/dao/QuestionsDAOImpl.java index 2e9fcb2..1d17687 100644 --- a/src/main/java/ru/otus/mkulikov/services/questions/dao/QuestionsDAOImpl.java +++ b/src/main/java/ru/otus/mkulikov/services/questions/dao/QuestionsDAOImpl.java @@ -3,6 +3,7 @@ import au.com.bytecode.opencsv.CSVReader; import au.com.bytecode.opencsv.bean.ColumnPositionMappingStrategy; import au.com.bytecode.opencsv.bean.CsvToBean; +import org.springframework.stereotype.Repository; import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; import ru.otus.mkulikov.models.Question; @@ -18,6 +19,7 @@ * Time: 16:42 */ +@Repository public class QuestionsDAOImpl implements QuestionsDAO { @SuppressWarnings({"rawtypes", "unchecked"}) diff --git a/src/main/java/ru/otus/mkulikov/services/registration/RegistrationServiceImpl.java b/src/main/java/ru/otus/mkulikov/services/registration/RegistrationServiceImpl.java index 2c70448..8fd3832 100644 --- a/src/main/java/ru/otus/mkulikov/services/registration/RegistrationServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/services/registration/RegistrationServiceImpl.java @@ -1,8 +1,10 @@ package ru.otus.mkulikov.services.registration; -import ru.otus.mkulikov.services.console.ConsoleService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; import ru.otus.mkulikov.models.User; +import ru.otus.mkulikov.services.console.ConsoleService; import static ru.otus.mkulikov.constants.StringConstants.c_error_load_consoleService; @@ -13,10 +15,12 @@ * Time: 16:34 */ +@Service public class RegistrationServiceImpl implements RegistrationService { - private ConsoleService consoleService; + private final ConsoleService consoleService; + @Autowired public RegistrationServiceImpl(ConsoleService consoleService) { this.consoleService = consoleService; } From 5836fb1dec14082953d92e9624e7b75043f8a84f Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Wed, 20 Mar 2019 01:55:23 +0300 Subject: [PATCH 09/15] =?UTF-8?q?=D0=97=D0=B0=D0=B3=D1=80=D1=83=D0=B7?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=B8=D0=BC=D0=B5=D0=BD=D0=B8=20=D1=84=D0=B0?= =?UTF-8?q?=D0=B9=D0=BB=D0=B0=20=D1=81=20=D0=B2=D0=BE=D0=BF=D1=80=D0=BE?= =?UTF-8?q?=D1=81=D0=B0=D0=BC=D0=B8=20=D0=B8=D0=B7=20=D0=BA=D0=BE=D0=BD?= =?UTF-8?q?=D1=84=D0=B8=D0=B3=D1=83=D1=80=D0=B0=D1=86=D0=B8=D0=BE=D0=BD?= =?UTF-8?q?=D0=BD=D0=BE=D0=B3=D0=BE=20=D1=84=D0=B0=D0=B9=D0=BB=D0=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 8 +++++++ .../questions/QuestionsServiceImpl.java | 9 +++++-- src/main/resources/config.properties | 1 + .../mkulikov/questions/QuestionsDAOTest.java | 24 ++++++++----------- 4 files changed, 26 insertions(+), 16 deletions(-) create mode 100644 src/main/resources/config.properties diff --git a/pom.xml b/pom.xml index bb61d64..8a15725 100644 --- a/pom.xml +++ b/pom.xml @@ -24,6 +24,13 @@ 5.0.9.RELEASE + + org.springframework + spring-test + 5.0.9.RELEASE + + + net.sf.opencsv opencsv @@ -108,6 +115,7 @@ src/main/resources **/*.csv + **/*.properties false diff --git a/src/main/java/ru/otus/mkulikov/services/questions/QuestionsServiceImpl.java b/src/main/java/ru/otus/mkulikov/services/questions/QuestionsServiceImpl.java index c749537..b404d0f 100644 --- a/src/main/java/ru/otus/mkulikov/services/questions/QuestionsServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/services/questions/QuestionsServiceImpl.java @@ -1,6 +1,8 @@ package ru.otus.mkulikov.services.questions; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.PropertySource; import org.springframework.stereotype.Service; import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; import ru.otus.mkulikov.models.Question; @@ -20,11 +22,14 @@ */ @Service +@PropertySource("classpath:config.properties") public class QuestionsServiceImpl implements QuestionsService { private final String c_delimeter = "---------------------------------------------------"; private final String c_answerNumbers = "1234"; - private final String c_questionsFileName = "questions.csv"; + + @Value("${questions.file.name}") + private String questionsFileName ; private final QuestionsDAO questionsDAO; private final ConsoleService consoleService; @@ -38,7 +43,7 @@ public QuestionsServiceImpl(QuestionsDAO questionsDAO, ConsoleService consoleSer @Override public void showQuestions() throws QuestionsFileLoadingException { getConsoleService().write(c_delimeter); - List questions = getQuestionsDAO().getQuestions(c_questionsFileName); + List questions = getQuestionsDAO().getQuestions(questionsFileName); if (questions == null) { throw new QuestionsFileLoadingException("Список вопросов пуст!"); diff --git a/src/main/resources/config.properties b/src/main/resources/config.properties new file mode 100644 index 0000000..4e513dc --- /dev/null +++ b/src/main/resources/config.properties @@ -0,0 +1 @@ +questions.file.name=questions.csv \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java b/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java index 0ba967c..b6d0826 100644 --- a/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java +++ b/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java @@ -25,20 +25,16 @@ class QuestionsDAOTest { @Test @DisplayName("Корректная загрузка вопросов") - public void loadQuestionsTest() { - try { - List questions = questionsDAO.getQuestions(c_questionsFileName); - - assertAll("questions", - () -> assertNotNull(questions), - () -> assertEquals(3, questions.size()), - () -> assertEquals(c_test1, questions.get(0).getQuestion()), - () -> assertEquals(c_test2, questions.get(1).getQuestion()), - () -> assertEquals(c_test3, questions.get(2).getQuestion()) - ); - } catch (QuestionsFileLoadingException e) { - e.printStackTrace(); - } + public void loadQuestionsTest() throws QuestionsFileLoadingException { + List questions = questionsDAO.getQuestions(c_questionsFileName); + + assertAll("questions", + () -> assertNotNull(questions), + () -> assertEquals(3, questions.size()), + () -> assertEquals(c_test1, questions.get(0).getQuestion()), + () -> assertEquals(c_test2, questions.get(1).getQuestion()), + () -> assertEquals(c_test3, questions.get(2).getQuestion()) + ); } @Test From da868941734952ecfda80fdb36630120f670bd86 Mon Sep 17 00:00:00 2001 From: "maxim.kulikov" Date: Wed, 20 Mar 2019 15:00:24 +0300 Subject: [PATCH 10/15] =?UTF-8?q?-=20=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=B8=D0=BD=D0=B3.=20-=20=D0=98=D1=81=D0=BF=D0=BE?= =?UTF-8?q?=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=B1?= =?UTF-8?q?=D0=B8=D0=B1=D0=BB=D0=B8=D0=BE=D1=82=D0=B5=D0=BA=D0=B8=20lombok?= =?UTF-8?q?.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 17 ---- pom.xml | 8 +- .../java/ru/otus/mkulikov/Application.java | 2 + .../mkulikov/constants/StringConstants.java | 16 ---- .../QuestionsFileLoadingException.java | 2 +- .../ru/otus/mkulikov/models/Question.java | 86 +++++-------------- .../java/ru/otus/mkulikov/models/User.java | 23 ++--- ...iceImpl.java => ConsoleIOServiceImpl.java} | 4 +- .../{ConsoleService.java => IOService.java} | 2 +- .../services/processor/ProcessorService.java | 4 +- .../processor/ProcessorServiceImpl.java | 24 +----- .../questions/QuestionsServiceImpl.java | 51 +++-------- .../services/questions/dao/QuestionsDAO.java | 2 +- .../questions/dao/QuestionsDAOImpl.java | 17 ++-- .../registration/RegistrationService.java | 4 +- .../registration/RegistrationServiceImpl.java | 30 +++---- .../QuestionsFileLoadingExceptionTest.java | 29 ------- .../ru/otus/mkulikov/model/QuestionTest.java | 76 ++++------------ .../processor/ProcessorServiceImplTest.java | 57 ------------ .../mkulikov/questions/QuestionsDAOTest.java | 25 +----- .../questions/QuestionsServiceImplTest.java | 57 ------------ .../RegistrationServiceImplTest.java | 39 --------- 22 files changed, 99 insertions(+), 476 deletions(-) delete mode 100644 src/main/java/ru/otus/mkulikov/constants/StringConstants.java rename src/main/java/ru/otus/mkulikov/services/console/{ConsoleServiceImpl.java => ConsoleIOServiceImpl.java} (86%) rename src/main/java/ru/otus/mkulikov/services/console/{ConsoleService.java => IOService.java} (85%) delete mode 100644 src/test/java/ru/otus/mkulikov/exceptions/QuestionsFileLoadingExceptionTest.java delete mode 100644 src/test/java/ru/otus/mkulikov/processor/ProcessorServiceImplTest.java delete mode 100644 src/test/java/ru/otus/mkulikov/questions/QuestionsServiceImplTest.java delete mode 100644 src/test/java/ru/otus/mkulikov/registration/RegistrationServiceImplTest.java diff --git a/README.md b/README.md index 893eb6e..33f056a 100644 --- a/README.md +++ b/README.md @@ -1,23 +1,6 @@ # OtusSpringHW -### Домашнее задание #1: -Программа по проведению тестирования студентов -В ресурсах хранятся вопросы и различные ответы к ним в виде CSV файла (5 вопросов). Программа должна спросить у пользователя фамилию и имя, спросить 5 вопросов из CSV-файла и вывести результат тестирования. -Все сервисы в программе должны решать строго определённую задачу. Зависимости должны быть настроены в IoC контейнере. -Опционально: сервисы, по возможности, покрыть тестами. - -##### 19-03-18 Доработки: -- Переименованы классы. -- Добавлено исключение QuestionsFileLoadingException. -- Работа с консолью вынесена в сервис ConsoleService. -- Тесты для QuestionsDAO. - -##### 19-03-19 Доработки: -- Переименованы классы. -- Добавлены тесты. ---- ### Домашнее задание #2: - Добавить файл настроек в приложение и для тестирования. - Локализовать выводимые сообщения и вопросы теста. - Переписать конфигурацию в виде Java + Annotation-based конфигурации. ---- \ No newline at end of file diff --git a/pom.xml b/pom.xml index 8a15725..bbb1616 100644 --- a/pom.xml +++ b/pom.xml @@ -30,7 +30,6 @@ 5.0.9.RELEASE - net.sf.opencsv opencsv @@ -77,6 +76,13 @@ 1.4.1 test + + + org.projectlombok + lombok + 1.18.4 + provided + diff --git a/src/main/java/ru/otus/mkulikov/Application.java b/src/main/java/ru/otus/mkulikov/Application.java index c6a283c..44ec99d 100644 --- a/src/main/java/ru/otus/mkulikov/Application.java +++ b/src/main/java/ru/otus/mkulikov/Application.java @@ -3,6 +3,7 @@ import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.PropertySource; import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; import ru.otus.mkulikov.services.processor.ProcessorService; @@ -15,6 +16,7 @@ @Configuration @ComponentScan +@PropertySource("classpath:config.properties") public class Application { public static void main(String[] args) { diff --git a/src/main/java/ru/otus/mkulikov/constants/StringConstants.java b/src/main/java/ru/otus/mkulikov/constants/StringConstants.java deleted file mode 100644 index 0673a74..0000000 --- a/src/main/java/ru/otus/mkulikov/constants/StringConstants.java +++ /dev/null @@ -1,16 +0,0 @@ -package ru.otus.mkulikov.constants; - -/** - * Created by IntelliJ IDEA. - * Developer: Maksim Kulikov - * Date: 2019-03-18 - * Time: 13:07 - */ - -public class StringConstants { - - public static final String c_error_load_consoleService = "Ошибка загрузки ConsoleService!"; - public static final String c_error_load_questionsDAO = "Ошибка загрузки QuestionsDAO!"; - public static final String c_error_load_questionsService = "Ошибка загрузки QuestionsService!"; - public static final String c_error_load_registrationService = "Ошибка загрузки RegistrationService!"; -} diff --git a/src/main/java/ru/otus/mkulikov/exceptions/QuestionsFileLoadingException.java b/src/main/java/ru/otus/mkulikov/exceptions/QuestionsFileLoadingException.java index 5a4e3bc..2105a5b 100644 --- a/src/main/java/ru/otus/mkulikov/exceptions/QuestionsFileLoadingException.java +++ b/src/main/java/ru/otus/mkulikov/exceptions/QuestionsFileLoadingException.java @@ -7,7 +7,7 @@ * Time: 01:40 */ -public class QuestionsFileLoadingException extends Exception { +public class QuestionsFileLoadingException extends RuntimeException { public QuestionsFileLoadingException(String message) { super(message); diff --git a/src/main/java/ru/otus/mkulikov/models/Question.java b/src/main/java/ru/otus/mkulikov/models/Question.java index 94ca74c..03f8256 100644 --- a/src/main/java/ru/otus/mkulikov/models/Question.java +++ b/src/main/java/ru/otus/mkulikov/models/Question.java @@ -1,5 +1,8 @@ package ru.otus.mkulikov.models; +import lombok.Getter; +import lombok.Setter; + import java.io.Serializable; /** @@ -11,89 +14,42 @@ public class Question implements Serializable { + @Setter + @Getter private String id; + @Setter + @Getter private String question; + @Setter + @Getter private String answer1; + @Setter + @Getter private String answer2; + @Setter + @Getter private String answer3; + @Setter + @Getter private String answer4; + @Setter + @Getter private String trueAnswer; + @Setter + @Getter private String userAnswer; - public String getId() { - return id; - } - - public void setId(String id) { + public Question(String id, String question, String answer1, String answer2, String answer3, String answer4, String trueAnswer, String userAnswer) { this.id = id; - } - - public String getQuestion() { - return question; - } - - public void setQuestion(String question) { this.question = question; - } - - public String getAnswer1() { - return answer1; - } - - public void setAnswer1(String answer1) { this.answer1 = answer1; - } - - public String getAnswer2() { - return answer2; - } - - public void setAnswer2(String answer2) { this.answer2 = answer2; - } - - public String getAnswer3() { - return answer3; - } - - public void setAnswer3(String answer3) { this.answer3 = answer3; - } - - public String getAnswer4() { - return answer4; - } - - public void setAnswer4(String answer4) { this.answer4 = answer4; - } - - public String getTrueAnswer() { - return trueAnswer; - } - - public void setTrueAnswer(String trueAnswer) { this.trueAnswer = trueAnswer; - } - - public String getUserAnswer() { - return userAnswer; - } - - public void setUserAnswer(String userAnswer) { this.userAnswer = userAnswer; } - @Override - public String toString() { - return "Question {" + - "id='" + id + '\'' + - ", question='" + question + '\'' + - ", answer1='" + answer1 + '\'' + - ", answer2='" + answer2 + '\'' + - ", answer3='" + answer3 + '\'' + - ", answer4='" + answer4 + '\'' + - ", trueAnswer='" + trueAnswer + '\'' + - '}'; + public Question() { } } diff --git a/src/main/java/ru/otus/mkulikov/models/User.java b/src/main/java/ru/otus/mkulikov/models/User.java index bb44f31..58c18f8 100644 --- a/src/main/java/ru/otus/mkulikov/models/User.java +++ b/src/main/java/ru/otus/mkulikov/models/User.java @@ -1,5 +1,8 @@ package ru.otus.mkulikov.models; +import lombok.Getter; +import lombok.Setter; + /** * Created by IntelliJ IDEA. * Developer: Maksim Kulikov @@ -9,27 +12,15 @@ public class User { + @Setter + @Getter private final String name; + @Setter + @Getter private final String surname; public User(String name, String surname) { this.name = name; this.surname = surname; } - - public String getName() { - return name; - } - - public String getSurname() { - return surname; - } - - @Override - public String toString() { - return "User {" + - "name='" + name + '\'' + - ", surname='" + surname + '\'' + - '}'; - } } diff --git a/src/main/java/ru/otus/mkulikov/services/console/ConsoleServiceImpl.java b/src/main/java/ru/otus/mkulikov/services/console/ConsoleIOServiceImpl.java similarity index 86% rename from src/main/java/ru/otus/mkulikov/services/console/ConsoleServiceImpl.java rename to src/main/java/ru/otus/mkulikov/services/console/ConsoleIOServiceImpl.java index 357b770..115a0e1 100644 --- a/src/main/java/ru/otus/mkulikov/services/console/ConsoleServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/services/console/ConsoleIOServiceImpl.java @@ -13,11 +13,11 @@ */ @Service -public class ConsoleServiceImpl implements ConsoleService { +public class ConsoleIOServiceImpl implements IOService { private final Scanner in; - public ConsoleServiceImpl() { + public ConsoleIOServiceImpl() { in = new Scanner(System.in); } diff --git a/src/main/java/ru/otus/mkulikov/services/console/ConsoleService.java b/src/main/java/ru/otus/mkulikov/services/console/IOService.java similarity index 85% rename from src/main/java/ru/otus/mkulikov/services/console/ConsoleService.java rename to src/main/java/ru/otus/mkulikov/services/console/IOService.java index a7e2f25..b6f92d3 100644 --- a/src/main/java/ru/otus/mkulikov/services/console/ConsoleService.java +++ b/src/main/java/ru/otus/mkulikov/services/console/IOService.java @@ -7,7 +7,7 @@ * Time: 23:21 */ -public interface ConsoleService { +public interface IOService { void write(String text); diff --git a/src/main/java/ru/otus/mkulikov/services/processor/ProcessorService.java b/src/main/java/ru/otus/mkulikov/services/processor/ProcessorService.java index 54e3c71..bfb3896 100644 --- a/src/main/java/ru/otus/mkulikov/services/processor/ProcessorService.java +++ b/src/main/java/ru/otus/mkulikov/services/processor/ProcessorService.java @@ -1,7 +1,5 @@ package ru.otus.mkulikov.services.processor; -import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; - /** * Created by IntelliJ IDEA. * Developer: Maksim Kulikov @@ -11,5 +9,5 @@ public interface ProcessorService { - void startTest() throws QuestionsFileLoadingException; + void startTest(); } diff --git a/src/main/java/ru/otus/mkulikov/services/processor/ProcessorServiceImpl.java b/src/main/java/ru/otus/mkulikov/services/processor/ProcessorServiceImpl.java index f398f9c..50a00aa 100644 --- a/src/main/java/ru/otus/mkulikov/services/processor/ProcessorServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/services/processor/ProcessorServiceImpl.java @@ -2,13 +2,9 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; import ru.otus.mkulikov.services.questions.QuestionsService; import ru.otus.mkulikov.services.registration.RegistrationService; -import static ru.otus.mkulikov.constants.StringConstants.c_error_load_questionsService; -import static ru.otus.mkulikov.constants.StringConstants.c_error_load_registrationService; - /** * Created by IntelliJ IDEA. * Developer: Maksim Kulikov @@ -29,22 +25,8 @@ public ProcessorServiceImpl(QuestionsService questionsService, RegistrationServi } @Override - public void startTest() throws QuestionsFileLoadingException { - getRegistration().addNewUser(); - getQuestionsService().showQuestions(); - } - - public QuestionsService getQuestionsService() throws QuestionsFileLoadingException { - if (questionsService == null) { - throw new QuestionsFileLoadingException(c_error_load_questionsService); - } - return questionsService; - } - - public RegistrationService getRegistration() throws QuestionsFileLoadingException { - if (registration == null) { - throw new QuestionsFileLoadingException(c_error_load_registrationService); - } - return registration; + public void startTest() { + registration.addNewUser(); + questionsService.showQuestions(); } } diff --git a/src/main/java/ru/otus/mkulikov/services/questions/QuestionsServiceImpl.java b/src/main/java/ru/otus/mkulikov/services/questions/QuestionsServiceImpl.java index b404d0f..e5eed5a 100644 --- a/src/main/java/ru/otus/mkulikov/services/questions/QuestionsServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/services/questions/QuestionsServiceImpl.java @@ -1,19 +1,14 @@ package ru.otus.mkulikov.services.questions; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.PropertySource; import org.springframework.stereotype.Service; import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; import ru.otus.mkulikov.models.Question; -import ru.otus.mkulikov.services.console.ConsoleService; +import ru.otus.mkulikov.services.console.IOService; import ru.otus.mkulikov.services.questions.dao.QuestionsDAO; import java.util.List; -import static ru.otus.mkulikov.constants.StringConstants.c_error_load_consoleService; -import static ru.otus.mkulikov.constants.StringConstants.c_error_load_questionsDAO; - /** * Created by IntelliJ IDEA. * Developer: Maksim Kulikov @@ -22,72 +17,54 @@ */ @Service -@PropertySource("classpath:config.properties") public class QuestionsServiceImpl implements QuestionsService { private final String c_delimeter = "---------------------------------------------------"; private final String c_answerNumbers = "1234"; - @Value("${questions.file.name}") - private String questionsFileName ; - private final QuestionsDAO questionsDAO; - private final ConsoleService consoleService; + private final IOService consoleService; @Autowired - public QuestionsServiceImpl(QuestionsDAO questionsDAO, ConsoleService consoleService) { + public QuestionsServiceImpl(QuestionsDAO questionsDAO, IOService consoleService) { this.questionsDAO = questionsDAO; this.consoleService = consoleService; } @Override public void showQuestions() throws QuestionsFileLoadingException { - getConsoleService().write(c_delimeter); - List questions = getQuestionsDAO().getQuestions(questionsFileName); + consoleService.write(c_delimeter); + List questions = questionsDAO.getQuestions(); if (questions == null) { throw new QuestionsFileLoadingException("Список вопросов пуст!"); } for (Question question : questions) { - getConsoleService().write(question.getQuestion()); - getConsoleService().write(question.getAnswer1()); - getConsoleService().write(question.getAnswer2()); - getConsoleService().write(question.getAnswer3()); - getConsoleService().write(question.getAnswer4()); + consoleService.write(question.getQuestion()); + consoleService.write(question.getAnswer1()); + consoleService.write(question.getAnswer2()); + consoleService.write(question.getAnswer3()); + consoleService.write(question.getAnswer4()); String answer = null; boolean okAnswer = false; int i = 0; while (!okAnswer && i < 4) { System.out.println("Введите номер ответа: "); - answer = getConsoleService().read(); + answer = consoleService.read(); okAnswer = c_answerNumbers.contains(answer); i++; } question.setUserAnswer((!okAnswer && i == 4) ? "0" : answer); - getConsoleService().write(c_delimeter); + consoleService.write(c_delimeter); } long count = questions.stream() .filter(obj -> obj.getTrueAnswer().equals(obj.getUserAnswer())) .count(); - getConsoleService().write("Количество правильных ответов: " + count + " из " + questions.size()); - getConsoleService().write(c_delimeter); - } - - public QuestionsDAO getQuestionsDAO() throws QuestionsFileLoadingException { - if (questionsDAO == null) { - throw new QuestionsFileLoadingException(c_error_load_questionsDAO); - } - return questionsDAO; - } - - public ConsoleService getConsoleService() throws QuestionsFileLoadingException { - if (consoleService == null) { - throw new QuestionsFileLoadingException(c_error_load_consoleService); - } - return consoleService; + consoleService.write("Количество правильных ответов: " + count + " из " + questions.size()); + consoleService.write(c_delimeter); } } diff --git a/src/main/java/ru/otus/mkulikov/services/questions/dao/QuestionsDAO.java b/src/main/java/ru/otus/mkulikov/services/questions/dao/QuestionsDAO.java index c2c08b3..96beeeb 100644 --- a/src/main/java/ru/otus/mkulikov/services/questions/dao/QuestionsDAO.java +++ b/src/main/java/ru/otus/mkulikov/services/questions/dao/QuestionsDAO.java @@ -14,5 +14,5 @@ public interface QuestionsDAO { - List getQuestions(String csvFilename) throws QuestionsFileLoadingException; + List getQuestions() throws QuestionsFileLoadingException; } diff --git a/src/main/java/ru/otus/mkulikov/services/questions/dao/QuestionsDAOImpl.java b/src/main/java/ru/otus/mkulikov/services/questions/dao/QuestionsDAOImpl.java index 1d17687..8eed393 100644 --- a/src/main/java/ru/otus/mkulikov/services/questions/dao/QuestionsDAOImpl.java +++ b/src/main/java/ru/otus/mkulikov/services/questions/dao/QuestionsDAOImpl.java @@ -3,6 +3,7 @@ import au.com.bytecode.opencsv.CSVReader; import au.com.bytecode.opencsv.bean.ColumnPositionMappingStrategy; import au.com.bytecode.opencsv.bean.CsvToBean; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Repository; import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; import ru.otus.mkulikov.models.Question; @@ -22,8 +23,15 @@ @Repository public class QuestionsDAOImpl implements QuestionsDAO { + private String csvFilename; + + public QuestionsDAOImpl(@Value("${questions.file.name}") String csvFilename) { + this.csvFilename = csvFilename; + } + @SuppressWarnings({"rawtypes", "unchecked"}) - private List loadFile(String csvFilename) throws QuestionsFileLoadingException { + @Override + public List getQuestions() throws QuestionsFileLoadingException { if (csvFilename == null) { throw new QuestionsFileLoadingException("Имя файла не может быть null!"); } @@ -47,7 +55,7 @@ private List loadFile(String csvFilename) throws QuestionsFileLoadingE } catch (URISyntaxException e) { throw new QuestionsFileLoadingException("Ошибка чтения файла!", e); } catch (UnsupportedEncodingException e) { - e.printStackTrace(); + throw new QuestionsFileLoadingException("Ошибка кодировки файла!", e); } return questions; } @@ -60,9 +68,4 @@ private ColumnPositionMappingStrategy setColumMapping() { strategy.setColumnMapping(columns); return strategy; } - - @Override - public List getQuestions(String csvFilename) throws QuestionsFileLoadingException { - return loadFile(csvFilename); - } } diff --git a/src/main/java/ru/otus/mkulikov/services/registration/RegistrationService.java b/src/main/java/ru/otus/mkulikov/services/registration/RegistrationService.java index 8b6d68e..8e0d4e1 100644 --- a/src/main/java/ru/otus/mkulikov/services/registration/RegistrationService.java +++ b/src/main/java/ru/otus/mkulikov/services/registration/RegistrationService.java @@ -1,7 +1,5 @@ package ru.otus.mkulikov.services.registration; -import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; - /** * Created by IntelliJ IDEA. * Developer: Maksim Kulikov @@ -11,5 +9,5 @@ public interface RegistrationService { - void addNewUser() throws QuestionsFileLoadingException; + void addNewUser(); } diff --git a/src/main/java/ru/otus/mkulikov/services/registration/RegistrationServiceImpl.java b/src/main/java/ru/otus/mkulikov/services/registration/RegistrationServiceImpl.java index 8fd3832..6523974 100644 --- a/src/main/java/ru/otus/mkulikov/services/registration/RegistrationServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/services/registration/RegistrationServiceImpl.java @@ -2,11 +2,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; import ru.otus.mkulikov.models.User; -import ru.otus.mkulikov.services.console.ConsoleService; - -import static ru.otus.mkulikov.constants.StringConstants.c_error_load_consoleService; +import ru.otus.mkulikov.services.console.IOService; /** * Created by IntelliJ IDEA. @@ -18,30 +15,23 @@ @Service public class RegistrationServiceImpl implements RegistrationService { - private final ConsoleService consoleService; + private final IOService consoleService; @Autowired - public RegistrationServiceImpl(ConsoleService consoleService) { + public RegistrationServiceImpl(IOService consoleService) { this.consoleService = consoleService; } @Override - public void addNewUser() throws QuestionsFileLoadingException { - getConsoleService().write("Введите свои данные"); - getConsoleService().write("Фамилия: "); - String surname = getConsoleService().read(); + public void addNewUser() { + consoleService.write("Введите свои данные"); + consoleService.write("Фамилия: "); + String surname = consoleService.read(); - getConsoleService().write("Имя: "); - String name = getConsoleService().read(); + consoleService.write("Имя: "); + String name = consoleService.read(); User user = new User(name, surname); - getConsoleService().write(String.format("Здравствуйте, %s %s!", user.getSurname(), user.getName())); - } - - public ConsoleService getConsoleService() throws QuestionsFileLoadingException { - if (consoleService == null) { - throw new QuestionsFileLoadingException(c_error_load_consoleService); - } - return consoleService; + consoleService.write(String.format("Здравствуйте, %s %s!", user.getSurname(), user.getName())); } } diff --git a/src/test/java/ru/otus/mkulikov/exceptions/QuestionsFileLoadingExceptionTest.java b/src/test/java/ru/otus/mkulikov/exceptions/QuestionsFileLoadingExceptionTest.java deleted file mode 100644 index 3b40a89..0000000 --- a/src/test/java/ru/otus/mkulikov/exceptions/QuestionsFileLoadingExceptionTest.java +++ /dev/null @@ -1,29 +0,0 @@ -package ru.otus.mkulikov.exceptions; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; - -/** - * Created by IntelliJ IDEA. - * Developer: Maksim Kulikov - * Date: 2019-03-18 - * Time: 11:39 - */ - -@DisplayName("Класс исключения QuestionsFileLoadingException") -class QuestionsFileLoadingExceptionTest { - - private final String c_not_supperted = "Not supported"; - - @Test - @DisplayName("Корректное заполнение исключения") - void shouldThrowException() { - Throwable exception = assertThrows(QuestionsFileLoadingException.class, () -> { - throw new QuestionsFileLoadingException(c_not_supperted); - }); - assertEquals(c_not_supperted, exception.getMessage()); - } -} \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/model/QuestionTest.java b/src/test/java/ru/otus/mkulikov/model/QuestionTest.java index fd315d2..f4f2074 100644 --- a/src/test/java/ru/otus/mkulikov/model/QuestionTest.java +++ b/src/test/java/ru/otus/mkulikov/model/QuestionTest.java @@ -1,10 +1,10 @@ package ru.otus.mkulikov.model; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import ru.otus.mkulikov.models.Question; +import static org.junit.jupiter.api.Assertions.assertAll; import static org.junit.jupiter.api.Assertions.assertEquals; /** @@ -26,66 +26,22 @@ class QuestionTest { private final String c_answer3 = "Answer3"; private final String c_answer4 = "Answer4"; - private Question question; - - @BeforeEach - public void createModelQuestion() { - question = new Question(); - question.setId(c_id); - question.setQuestion(c_question); - question.setUserAnswer(c_userAnswer); - question.setTrueAnswer(c_trueAnswer); - question.setAnswer1(c_answer1); - question.setAnswer2(c_answer2); - question.setAnswer3(c_answer3); - question.setAnswer4(c_answer4); - } - - @Test - @DisplayName("Корректное заполнение id") - public void fillIdTest() { - assertEquals(c_id, question.getId()); - } - @Test - @DisplayName("Корректное заполнение question") + @DisplayName("Корректное заполнение") public void fillQuestionTest() { - assertEquals(c_question, question.getQuestion()); - } - - @Test - @DisplayName("Корректное заполнение userAnswer") - public void fillUserAnsweTest() { - assertEquals(c_userAnswer, question.getUserAnswer()); - } - - @Test - @DisplayName("Корректное заполнение trueAnswer") - public void fillTrueAnsweTest() { - assertEquals(c_trueAnswer, question.getTrueAnswer()); - } - - @Test - @DisplayName("Корректное заполнение answer1") - public void fillAnswer1AnsweTest() { - assertEquals(c_answer1, question.getAnswer1()); - } - - @Test - @DisplayName("Корректное заполнение answer2") - public void fillAnswer2AnsweTest() { - assertEquals(c_answer2, question.getAnswer2()); - } - - @Test - @DisplayName("Корректное заполнение answer3") - public void fillAnswer3AnsweTest() { - assertEquals(c_answer3, question.getAnswer3()); - } - - @Test - @DisplayName("Корректное заполнение answer4") - public void fillAnswer4AnsweTest() { - assertEquals(c_answer4, question.getAnswer4()); + Question question = new Question( + c_id, c_question, c_answer1, c_answer2, c_answer3, c_answer4, c_trueAnswer, c_userAnswer + ); + + assertAll("question", + () -> assertEquals(c_id, question.getId()), + () -> assertEquals(c_question, question.getQuestion()), + () -> assertEquals(c_userAnswer, question.getUserAnswer()), + () -> assertEquals(c_trueAnswer, question.getTrueAnswer()), + () -> assertEquals(c_answer1, question.getAnswer1()), + () -> assertEquals(c_answer2, question.getAnswer2()), + () -> assertEquals(c_answer3, question.getAnswer3()), + () -> assertEquals(c_answer4, question.getAnswer4()) + ); } } \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/processor/ProcessorServiceImplTest.java b/src/test/java/ru/otus/mkulikov/processor/ProcessorServiceImplTest.java deleted file mode 100644 index 2928f53..0000000 --- a/src/test/java/ru/otus/mkulikov/processor/ProcessorServiceImplTest.java +++ /dev/null @@ -1,57 +0,0 @@ -package ru.otus.mkulikov.processor; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; -import ru.otus.mkulikov.services.processor.ProcessorServiceImpl; - -import static org.junit.jupiter.api.Assertions.*; -import static ru.otus.mkulikov.constants.StringConstants.c_error_load_questionsService; -import static ru.otus.mkulikov.constants.StringConstants.c_error_load_registrationService; - -/** - * Created by IntelliJ IDEA. - * Developer: Maksim Kulikov - * Date: 2019-03-18 - * Time: 11:37 - */ - -@DisplayName("Класс ProcessorServiceImpl") -class ProcessorServiceImplTest { - - private final ProcessorServiceImpl processorServiceNull = new ProcessorServiceImpl(null, null); - - @Test - @DisplayName("Корректный тип исключения для getQuestionsProcess") - void getExceptionTypeQuestionsProcessTest() { - assertThrows(QuestionsFileLoadingException.class, () -> { - processorServiceNull.getQuestionsService(); - }); - } - - @Test - @DisplayName("Корректное исключение для getQuestionsProcess") - void getExceptionQuestionsProcessTest() { - Throwable exception = assertThrows(QuestionsFileLoadingException.class, () -> { - processorServiceNull.getQuestionsService(); - }); - assertEquals(c_error_load_questionsService, exception.getMessage()); - } - - @Test - @DisplayName("Корректный тип исключения для getRegistrationTest") - void getExceptionTypeRegistrationTest() { - assertThrows(QuestionsFileLoadingException.class, () -> { - processorServiceNull.getRegistration(); - }); - } - - @Test - @DisplayName("Корректное исключение для getRegistrationTest") - void getExceptionRegistrationTest() { - Throwable exception = assertThrows(QuestionsFileLoadingException.class, () -> { - processorServiceNull.getRegistration(); - }); - assertEquals(c_error_load_registrationService, exception.getMessage()); - } -} \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java b/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java index b6d0826..104b80a 100644 --- a/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java +++ b/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java @@ -14,10 +14,7 @@ @DisplayName("Класс QuestionsDAO") class QuestionsDAOTest { - private final QuestionsDAO questionsDAO = new QuestionsDAOImpl(); - - private final String c_questionsFileName = "test_questions.csv"; - private final String c_questionsBadFileName = "test.csv"; + private final QuestionsDAO questionsDAO = new QuestionsDAOImpl("test_questions.csv"); private final String c_test1 = "Тест1"; private final String c_test2 = "Тест2"; @@ -26,7 +23,7 @@ class QuestionsDAOTest { @Test @DisplayName("Корректная загрузка вопросов") public void loadQuestionsTest() throws QuestionsFileLoadingException { - List questions = questionsDAO.getQuestions(c_questionsFileName); + List questions = questionsDAO.getQuestions(); assertAll("questions", () -> assertNotNull(questions), @@ -36,22 +33,4 @@ public void loadQuestionsTest() throws QuestionsFileLoadingException { () -> assertEquals(c_test3, questions.get(2).getQuestion()) ); } - - @Test - @DisplayName("Корректное исключение на null") - public void loadNullExceptionQuestionsTest() { - Throwable exception = assertThrows(QuestionsFileLoadingException.class, () -> { - questionsDAO.getQuestions(null); - }); - assertEquals("Имя файла не может быть null!", exception.getMessage()); - } - - @Test - @DisplayName("Корректное исключение на неверное имя файла") - public void loadExceptionQuestionsTest() { - Throwable exception = assertThrows(QuestionsFileLoadingException.class, () -> { - questionsDAO.getQuestions(c_questionsBadFileName); - }); - assertEquals(String.format("Ошибка загрузки ресурса с именем %s!", c_questionsBadFileName), exception.getMessage()); - } } \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/questions/QuestionsServiceImplTest.java b/src/test/java/ru/otus/mkulikov/questions/QuestionsServiceImplTest.java deleted file mode 100644 index 2935fc0..0000000 --- a/src/test/java/ru/otus/mkulikov/questions/QuestionsServiceImplTest.java +++ /dev/null @@ -1,57 +0,0 @@ -package ru.otus.mkulikov.questions; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; -import ru.otus.mkulikov.services.questions.QuestionsServiceImpl; - -import static org.junit.jupiter.api.Assertions.*; -import static ru.otus.mkulikov.constants.StringConstants.c_error_load_consoleService; -import static ru.otus.mkulikov.constants.StringConstants.c_error_load_questionsDAO; - -/** - * Created by IntelliJ IDEA. - * Developer: Maksim Kulikov - * Date: 2019-03-18 - * Time: 12:00 - */ - -@DisplayName("Класс QuestionsServiceImpl") -class QuestionsServiceImplTest { - - private final QuestionsServiceImpl questionsService = new QuestionsServiceImpl(null, null); - - @Test - @DisplayName("Корректный тип исключения для getQuestionsDAO") - void getExceptionTypeQuestionsDAO() { - assertThrows(QuestionsFileLoadingException.class, () -> { - questionsService.getQuestionsDAO(); - }); - } - - @Test - @DisplayName("Корректное исключение для getQuestionsDAO") - void getExceptionQuestionsDAO() { - Throwable exception = assertThrows(QuestionsFileLoadingException.class, () -> { - questionsService.getQuestionsDAO(); - }); - assertEquals(c_error_load_questionsDAO, exception.getMessage()); - } - - @Test - @DisplayName("Корректный тип исключения для getConsoleService") - void getExceptionTypeConsoleService() { - assertThrows(QuestionsFileLoadingException.class, () -> { - questionsService.getConsoleService(); - }); - } - - @Test - @DisplayName("Корректное исключение для getConsoleService") - void getExceptionConsoleService() { - Throwable exception = assertThrows(QuestionsFileLoadingException.class, () -> { - questionsService.getConsoleService(); - }); - assertEquals(c_error_load_consoleService, exception.getMessage()); - } -} \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/registration/RegistrationServiceImplTest.java b/src/test/java/ru/otus/mkulikov/registration/RegistrationServiceImplTest.java deleted file mode 100644 index 0252a9d..0000000 --- a/src/test/java/ru/otus/mkulikov/registration/RegistrationServiceImplTest.java +++ /dev/null @@ -1,39 +0,0 @@ -package ru.otus.mkulikov.registration; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; -import ru.otus.mkulikov.services.registration.RegistrationServiceImpl; - -import static org.junit.jupiter.api.Assertions.*; -import static ru.otus.mkulikov.constants.StringConstants.c_error_load_consoleService; - -/** - * Created by IntelliJ IDEA. - * Developer: Maksim Kulikov - * Date: 2019-03-18 - * Time: 13:02 - */ - -@DisplayName("Класс RegistrationServiceImpl") -class RegistrationServiceImplTest { - - private final RegistrationServiceImpl registrationService = new RegistrationServiceImpl(null); - - @Test - @DisplayName("Корректный тип исключения для getConsoleService") - void getExceptionTypeConsoleServiceTest() { - assertThrows(QuestionsFileLoadingException.class, () -> { - registrationService.getConsoleService(); - }); - } - - @Test - @DisplayName("Корректное исключение для getQuestionsDAO") - void getExceptionConsoleServiceTest() { - Throwable exception = assertThrows(QuestionsFileLoadingException.class, () -> { - registrationService.getConsoleService(); - }); - assertEquals(c_error_load_consoleService, exception.getMessage()); - } -} \ No newline at end of file From c27da6c1d37b39c50995a0f44b9f3ec1f3374655 Mon Sep 17 00:00:00 2001 From: "maxim.kulikov" Date: Thu, 21 Mar 2019 16:10:09 +0300 Subject: [PATCH 11/15] =?UTF-8?q?-=20=D0=9B=D0=BE=D0=BA=D0=B0=D0=BB=D0=B8?= =?UTF-8?q?=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=20=D0=B4=D0=BB=D1=8F=20=D0=B2?= =?UTF-8?q?=D0=BE=D0=BF=D1=80=D0=BE=D1=81=D0=BE=D0=B2=20=D0=B8=20=D1=81?= =?UTF-8?q?=D0=BE=D0=BE=D0=B1=D1=89=D0=B5=D0=BD=D0=B8=D0=B9.=20-=20=D0=A4?= =?UTF-8?q?=D0=B0=D0=B9=D0=BB=20=D0=BD=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B5?= =?UTF-8?q?=D0=BA.=20-=20Java=20+=20Annotation-based=20=D0=BA=D0=BE=D0=BD?= =?UTF-8?q?=D1=84=D0=B8=D0=B3=D1=83=D1=80=D0=B0=D1=86=D0=B8=D1=8F.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/ru/otus/mkulikov/Application.java | 2 +- .../localisation/LocalisationService.java | 15 +++++++ .../localisation/LocalisationServiceImpl.java | 43 +++++++++++++++++++ .../questions/QuestionsServiceImpl.java | 19 +++++--- .../questions/dao/QuestionsDAOImpl.java | 23 +++++----- .../registration/RegistrationServiceImpl.java | 15 ++++--- src/main/resources/application.properties | 3 ++ src/main/resources/config.properties | 1 - src/main/resources/i18n/bundle_en.properties | 12 ++++++ src/main/resources/i18n/bundle_ru.properties | 12 ++++++ src/main/resources/questions/en.csv | 5 +++ .../{questions.csv => questions/ru.csv} | 0 .../mkulikov/questions/QuestionsDAOTest.java | 4 +- .../{test_questions.csv => questions/ru.csv} | 0 14 files changed, 129 insertions(+), 25 deletions(-) create mode 100644 src/main/java/ru/otus/mkulikov/services/localisation/LocalisationService.java create mode 100644 src/main/java/ru/otus/mkulikov/services/localisation/LocalisationServiceImpl.java create mode 100644 src/main/resources/application.properties delete mode 100644 src/main/resources/config.properties create mode 100644 src/main/resources/i18n/bundle_en.properties create mode 100644 src/main/resources/i18n/bundle_ru.properties create mode 100644 src/main/resources/questions/en.csv rename src/main/resources/{questions.csv => questions/ru.csv} (100%) rename src/test/resources/{test_questions.csv => questions/ru.csv} (100%) diff --git a/src/main/java/ru/otus/mkulikov/Application.java b/src/main/java/ru/otus/mkulikov/Application.java index 44ec99d..3f6ee5d 100644 --- a/src/main/java/ru/otus/mkulikov/Application.java +++ b/src/main/java/ru/otus/mkulikov/Application.java @@ -16,7 +16,7 @@ @Configuration @ComponentScan -@PropertySource("classpath:config.properties") +@PropertySource("classpath:application.properties") public class Application { public static void main(String[] args) { diff --git a/src/main/java/ru/otus/mkulikov/services/localisation/LocalisationService.java b/src/main/java/ru/otus/mkulikov/services/localisation/LocalisationService.java new file mode 100644 index 0000000..fa1f7fe --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/services/localisation/LocalisationService.java @@ -0,0 +1,15 @@ +package ru.otus.mkulikov.services.localisation; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 2019-03-21 + * Time: 14:02 + */ + +public interface LocalisationService { + + String getValue(String key); + + String getValueWithParams(String key, String[] params); +} diff --git a/src/main/java/ru/otus/mkulikov/services/localisation/LocalisationServiceImpl.java b/src/main/java/ru/otus/mkulikov/services/localisation/LocalisationServiceImpl.java new file mode 100644 index 0000000..9c9d4ff --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/services/localisation/LocalisationServiceImpl.java @@ -0,0 +1,43 @@ +package ru.otus.mkulikov.services.localisation; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.support.ReloadableResourceBundleMessageSource; +import org.springframework.stereotype.Service; + +import java.util.Locale; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 2019-03-21 + * Time: 14:02 + */ + +@Service +public class LocalisationServiceImpl extends ReloadableResourceBundleMessageSource implements LocalisationService { + + private final Locale locale; + public static final Locale RUSSIAN = new Locale("ru"); + + public LocalisationServiceImpl( + @Value("${locale.basename}") String basename, + @Value("${locale.default.encoding}") String defaultEncoding, + @Value("${locale.default}") String localeDefault + ) { + super(); + setBasename(basename); + setDefaultEncoding(defaultEncoding); + + locale = (localeDefault != null) + ? new Locale(localeDefault) + : RUSSIAN; + } + + public String getValue(String key) { + return getMessage(key, null, locale); + } + + public String getValueWithParams(String key, String[] params) { + return getMessage(key, params, locale); + } +} diff --git a/src/main/java/ru/otus/mkulikov/services/questions/QuestionsServiceImpl.java b/src/main/java/ru/otus/mkulikov/services/questions/QuestionsServiceImpl.java index e5eed5a..040357c 100644 --- a/src/main/java/ru/otus/mkulikov/services/questions/QuestionsServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/services/questions/QuestionsServiceImpl.java @@ -5,6 +5,7 @@ import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; import ru.otus.mkulikov.models.Question; import ru.otus.mkulikov.services.console.IOService; +import ru.otus.mkulikov.services.localisation.LocalisationService; import ru.otus.mkulikov.services.questions.dao.QuestionsDAO; import java.util.List; @@ -24,11 +25,13 @@ public class QuestionsServiceImpl implements QuestionsService { private final QuestionsDAO questionsDAO; private final IOService consoleService; + private final LocalisationService localisationService; @Autowired - public QuestionsServiceImpl(QuestionsDAO questionsDAO, IOService consoleService) { + public QuestionsServiceImpl(QuestionsDAO questionsDAO, IOService consoleService, LocalisationService localisationService) { this.questionsDAO = questionsDAO; this.consoleService = consoleService; + this.localisationService = localisationService; } @Override @@ -36,10 +39,6 @@ public void showQuestions() throws QuestionsFileLoadingException { consoleService.write(c_delimeter); List questions = questionsDAO.getQuestions(); - if (questions == null) { - throw new QuestionsFileLoadingException("Список вопросов пуст!"); - } - for (Question question : questions) { consoleService.write(question.getQuestion()); consoleService.write(question.getAnswer1()); @@ -51,7 +50,7 @@ public void showQuestions() throws QuestionsFileLoadingException { boolean okAnswer = false; int i = 0; while (!okAnswer && i < 4) { - System.out.println("Введите номер ответа: "); + consoleService.write(localisationService.getValue("enter.answer")); answer = consoleService.read(); okAnswer = c_answerNumbers.contains(answer); i++; @@ -64,7 +63,13 @@ public void showQuestions() throws QuestionsFileLoadingException { long count = questions.stream() .filter(obj -> obj.getTrueAnswer().equals(obj.getUserAnswer())) .count(); - consoleService.write("Количество правильных ответов: " + count + " из " + questions.size()); + + consoleService.write( + localisationService.getValueWithParams( + "count.true.answers", + new String[] {String.valueOf(count), String.valueOf(questions.size())} + ) + ); consoleService.write(c_delimeter); } } diff --git a/src/main/java/ru/otus/mkulikov/services/questions/dao/QuestionsDAOImpl.java b/src/main/java/ru/otus/mkulikov/services/questions/dao/QuestionsDAOImpl.java index 8eed393..8e38157 100644 --- a/src/main/java/ru/otus/mkulikov/services/questions/dao/QuestionsDAOImpl.java +++ b/src/main/java/ru/otus/mkulikov/services/questions/dao/QuestionsDAOImpl.java @@ -3,14 +3,15 @@ import au.com.bytecode.opencsv.CSVReader; import au.com.bytecode.opencsv.bean.ColumnPositionMappingStrategy; import au.com.bytecode.opencsv.bean.CsvToBean; -import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Repository; import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; import ru.otus.mkulikov.models.Question; +import ru.otus.mkulikov.services.localisation.LocalisationService; import java.io.*; import java.net.URISyntaxException; import java.net.URL; +import java.util.ArrayList; import java.util.List; /** @@ -23,25 +24,27 @@ @Repository public class QuestionsDAOImpl implements QuestionsDAO { - private String csvFilename; + private final LocalisationService localisationService; - public QuestionsDAOImpl(@Value("${questions.file.name}") String csvFilename) { - this.csvFilename = csvFilename; + public QuestionsDAOImpl(LocalisationService localisationService) { + this.localisationService = localisationService; } @SuppressWarnings({"rawtypes", "unchecked"}) @Override public List getQuestions() throws QuestionsFileLoadingException { + String csvFilename = localisationService.getValue("csv.file.name"); + if (csvFilename == null) { - throw new QuestionsFileLoadingException("Имя файла не может быть null!"); + throw new QuestionsFileLoadingException(localisationService.getValue("questions.load.null.filename")); } - List questions = null; + List questions = new ArrayList(); try { URL url = getClass().getResource("/" + csvFilename); if (url == null) { throw new QuestionsFileLoadingException( - String.format("Ошибка загрузки ресурса с именем %s!", csvFilename) + localisationService.getValueWithParams("questions.load.error.filename", new String[] {csvFilename}) ); } @@ -51,11 +54,11 @@ public List getQuestions() throws QuestionsFileLoadingException { questions = csv.parse(setColumMapping(), csvReader); } catch (FileNotFoundException e) { - throw new QuestionsFileLoadingException("Файл с именем " + csvFilename + " не найден!", e); + throw new QuestionsFileLoadingException(localisationService.getValueWithParams("questions.find.error.filename", new String[] {csvFilename}), e); } catch (URISyntaxException e) { - throw new QuestionsFileLoadingException("Ошибка чтения файла!", e); + throw new QuestionsFileLoadingException(localisationService.getValue("questions.read.error"), e); } catch (UnsupportedEncodingException e) { - throw new QuestionsFileLoadingException("Ошибка кодировки файла!", e); + throw new QuestionsFileLoadingException(localisationService.getValue("questions.encoding.error"), e); } return questions; } diff --git a/src/main/java/ru/otus/mkulikov/services/registration/RegistrationServiceImpl.java b/src/main/java/ru/otus/mkulikov/services/registration/RegistrationServiceImpl.java index 6523974..08c64a0 100644 --- a/src/main/java/ru/otus/mkulikov/services/registration/RegistrationServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/services/registration/RegistrationServiceImpl.java @@ -4,6 +4,7 @@ import org.springframework.stereotype.Service; import ru.otus.mkulikov.models.User; import ru.otus.mkulikov.services.console.IOService; +import ru.otus.mkulikov.services.localisation.LocalisationService; /** * Created by IntelliJ IDEA. @@ -16,22 +17,26 @@ public class RegistrationServiceImpl implements RegistrationService { private final IOService consoleService; + private final LocalisationService localisationService; @Autowired - public RegistrationServiceImpl(IOService consoleService) { + public RegistrationServiceImpl(IOService consoleService, LocalisationService localisationService) { this.consoleService = consoleService; + this.localisationService = localisationService; } @Override public void addNewUser() { - consoleService.write("Введите свои данные"); - consoleService.write("Фамилия: "); + consoleService.write(localisationService.getValue("enter.your.data")); + consoleService.write(localisationService.getValue("enter.your.surname")); String surname = consoleService.read(); - consoleService.write("Имя: "); + consoleService.write(localisationService.getValue("enter.your.name")); String name = consoleService.read(); User user = new User(name, surname); - consoleService.write(String.format("Здравствуйте, %s %s!", user.getSurname(), user.getName())); + consoleService.write( + localisationService.getValueWithParams("hello.user", new String[] {user.getName(), user.getSurname()}) + ); } } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties new file mode 100644 index 0000000..f676796 --- /dev/null +++ b/src/main/resources/application.properties @@ -0,0 +1,3 @@ +locale.basename=/i18n/bundle +locale.default.encoding=UTF-8 +locale.default=ru \ No newline at end of file diff --git a/src/main/resources/config.properties b/src/main/resources/config.properties deleted file mode 100644 index 4e513dc..0000000 --- a/src/main/resources/config.properties +++ /dev/null @@ -1 +0,0 @@ -questions.file.name=questions.csv \ No newline at end of file diff --git a/src/main/resources/i18n/bundle_en.properties b/src/main/resources/i18n/bundle_en.properties new file mode 100644 index 0000000..be4e3ea --- /dev/null +++ b/src/main/resources/i18n/bundle_en.properties @@ -0,0 +1,12 @@ +count.true.answers=Number of correct answers: {0} of {1} +csv.file.name=questions/en.csv +enter.answer=Enter answer number: +enter.your.data=Enter your data +enter.your.name=Name: +enter.your.surname=Surname: +hello.user=Hello, {0} {1}! +questions.encoding.error=File encoding error! +questions.find.error.filename=File named {0} not found! +questions.load.error.filename=Error loading file named {0}! +questions.load.null.filename=The file name cannot be null! +questions.read.error=File read error! \ No newline at end of file diff --git a/src/main/resources/i18n/bundle_ru.properties b/src/main/resources/i18n/bundle_ru.properties new file mode 100644 index 0000000..5ab475f --- /dev/null +++ b/src/main/resources/i18n/bundle_ru.properties @@ -0,0 +1,12 @@ +count.true.answers=Количество правильных ответов: {0} из {1} +csv.file.name=questions/ru.csv +enter.answer=Введите номер ответа: +enter.your.data=Введите свои данные +enter.your.name=Имя: +enter.your.surname=Фамилия: +hello.user=Здравствуйте, {0} {1}! +questions.encoding.error=Ошибка кодировки файла! +questions.find.error.filename=Файл с именем {0} не найден! +questions.load.error.filename=Ошибка загрузки файла с именем {0}! +questions.load.null.filename=Имя файла не может быть null! +questions.read.error=Ошибка чтения файла! \ No newline at end of file diff --git a/src/main/resources/questions/en.csv b/src/main/resources/questions/en.csv new file mode 100644 index 0000000..4d91327 --- /dev/null +++ b/src/main/resources/questions/en.csv @@ -0,0 +1,5 @@ +1,Which list is not a design pattern?,1. Facade,2. Object,3. Factory,4. Singleton,2 +2,Which type is not primitive?,1. String,2. int,3. char,4. boolean,1 +3,How many classes can be inherited in Java?,1. One,2. Two,3. Three,4. Four,1 +4,Which collection contains unique objects?,1. List,2. Map,3. Set,4. Queue,3 +5,What value cannot be put in the primitive type - int?,1. -1,2. 0,3. 10,4. null,4 \ No newline at end of file diff --git a/src/main/resources/questions.csv b/src/main/resources/questions/ru.csv similarity index 100% rename from src/main/resources/questions.csv rename to src/main/resources/questions/ru.csv diff --git a/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java b/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java index 104b80a..adb2665 100644 --- a/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java +++ b/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java @@ -4,6 +4,7 @@ import org.junit.jupiter.api.Test; import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; import ru.otus.mkulikov.models.Question; +import ru.otus.mkulikov.services.localisation.LocalisationServiceImpl; import ru.otus.mkulikov.services.questions.dao.QuestionsDAO; import ru.otus.mkulikov.services.questions.dao.QuestionsDAOImpl; @@ -14,7 +15,8 @@ @DisplayName("Класс QuestionsDAO") class QuestionsDAOTest { - private final QuestionsDAO questionsDAO = new QuestionsDAOImpl("test_questions.csv"); + private final LocalisationServiceImpl localisationService = new LocalisationServiceImpl("/i18n/bundle", "UTF-8", "ru"); + private final QuestionsDAO questionsDAO = new QuestionsDAOImpl(localisationService); private final String c_test1 = "Тест1"; private final String c_test2 = "Тест2"; diff --git a/src/test/resources/test_questions.csv b/src/test/resources/questions/ru.csv similarity index 100% rename from src/test/resources/test_questions.csv rename to src/test/resources/questions/ru.csv From d1ca11a3067ba6bd76bf54e2082d4f8f9a90295c Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Fri, 22 Mar 2019 01:27:24 +0300 Subject: [PATCH 12/15] =?UTF-8?q?-=20=D0=A3=D0=B1=D1=80=D0=B0=D0=BD=D1=8B?= =?UTF-8?q?=20=D0=BB=D0=B8=D1=88=D0=BD=D0=B8=D0=B5=20=D1=82=D0=B5=D1=81?= =?UTF-8?q?=D1=82=D1=8B.=20-=20=D0=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=D0=B0=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=20=D1=81=20=D1=84?= =?UTF-8?q?=D0=B0=D0=B9=D0=BB=D0=BE=D0=BC.=20-=20=D0=98=D1=81=D0=BF=D0=BE?= =?UTF-8?q?=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20@Data?= =?UTF-8?q?=20=D0=B2=D0=BC=D0=B5=D1=81=D1=82=D0=BE=20@Getter,=20@Setter.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 7 ++- .../ru/otus/mkulikov/models/Question.java | 20 +------- .../java/ru/otus/mkulikov/models/User.java | 8 +--- .../questions/QuestionsServiceImpl.java | 2 +- .../questions/dao/QuestionsDAOImpl.java | 45 ++++++++---------- src/main/resources/application.properties | 4 +- src/main/resources/i18n/bundle_en.properties | 7 ++- src/main/resources/i18n/bundle_ru.properties | 7 ++- .../ru/otus/mkulikov/model/QuestionTest.java | 47 ------------------- .../java/ru/otus/mkulikov/model/UserTest.java | 34 -------------- .../mkulikov/questions/QuestionsDAOTest.java | 2 +- 11 files changed, 40 insertions(+), 143 deletions(-) delete mode 100644 src/test/java/ru/otus/mkulikov/model/QuestionTest.java delete mode 100644 src/test/java/ru/otus/mkulikov/model/UserTest.java diff --git a/README.md b/README.md index 33f056a..2af3090 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,11 @@ # OtusSpringHW -### Домашнее задание #2: +Домашнее задание #2: - Добавить файл настроек в приложение и для тестирования. - Локализовать выводимые сообщения и вопросы теста. - Переписать конфигурацию в виде Java + Annotation-based конфигурации. + +### 19-03-22 Доработки: +- Убраны лишние тесты. +- Изменена работа с файлом. +- Использование @Data вместо @Getter, @Setter. diff --git a/src/main/java/ru/otus/mkulikov/models/Question.java b/src/main/java/ru/otus/mkulikov/models/Question.java index 03f8256..e148602 100644 --- a/src/main/java/ru/otus/mkulikov/models/Question.java +++ b/src/main/java/ru/otus/mkulikov/models/Question.java @@ -1,7 +1,6 @@ package ru.otus.mkulikov.models; -import lombok.Getter; -import lombok.Setter; +import lombok.Data; import java.io.Serializable; @@ -12,31 +11,16 @@ * Time: 15:54 */ +@Data public class Question implements Serializable { - @Setter - @Getter private String id; - @Setter - @Getter private String question; - @Setter - @Getter private String answer1; - @Setter - @Getter private String answer2; - @Setter - @Getter private String answer3; - @Setter - @Getter private String answer4; - @Setter - @Getter private String trueAnswer; - @Setter - @Getter private String userAnswer; public Question(String id, String question, String answer1, String answer2, String answer3, String answer4, String trueAnswer, String userAnswer) { diff --git a/src/main/java/ru/otus/mkulikov/models/User.java b/src/main/java/ru/otus/mkulikov/models/User.java index 58c18f8..52a10f1 100644 --- a/src/main/java/ru/otus/mkulikov/models/User.java +++ b/src/main/java/ru/otus/mkulikov/models/User.java @@ -1,7 +1,6 @@ package ru.otus.mkulikov.models; -import lombok.Getter; -import lombok.Setter; +import lombok.Data; /** * Created by IntelliJ IDEA. @@ -10,13 +9,10 @@ * Time: 15:29 */ +@Data public class User { - @Setter - @Getter private final String name; - @Setter - @Getter private final String surname; public User(String name, String surname) { diff --git a/src/main/java/ru/otus/mkulikov/services/questions/QuestionsServiceImpl.java b/src/main/java/ru/otus/mkulikov/services/questions/QuestionsServiceImpl.java index 040357c..672ff7e 100644 --- a/src/main/java/ru/otus/mkulikov/services/questions/QuestionsServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/services/questions/QuestionsServiceImpl.java @@ -52,7 +52,7 @@ public void showQuestions() throws QuestionsFileLoadingException { while (!okAnswer && i < 4) { consoleService.write(localisationService.getValue("enter.answer")); answer = consoleService.read(); - okAnswer = c_answerNumbers.contains(answer); + okAnswer = c_answerNumbers.contains(answer) && !answer.isEmpty(); i++; } diff --git a/src/main/java/ru/otus/mkulikov/services/questions/dao/QuestionsDAOImpl.java b/src/main/java/ru/otus/mkulikov/services/questions/dao/QuestionsDAOImpl.java index 8e38157..eb09c51 100644 --- a/src/main/java/ru/otus/mkulikov/services/questions/dao/QuestionsDAOImpl.java +++ b/src/main/java/ru/otus/mkulikov/services/questions/dao/QuestionsDAOImpl.java @@ -3,15 +3,17 @@ import au.com.bytecode.opencsv.CSVReader; import au.com.bytecode.opencsv.bean.ColumnPositionMappingStrategy; import au.com.bytecode.opencsv.bean.CsvToBean; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.io.ClassPathResource; import org.springframework.stereotype.Repository; import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; import ru.otus.mkulikov.models.Question; import ru.otus.mkulikov.services.localisation.LocalisationService; -import java.io.*; -import java.net.URISyntaxException; -import java.net.URL; -import java.util.ArrayList; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.UnsupportedEncodingException; import java.util.List; /** @@ -25,40 +27,31 @@ public class QuestionsDAOImpl implements QuestionsDAO { private final LocalisationService localisationService; + private final String defaultFileDir; - public QuestionsDAOImpl(LocalisationService localisationService) { + public QuestionsDAOImpl( + LocalisationService localisationService, + @Value("${questions.default.dir}") String defaultFileDir + ) { this.localisationService = localisationService; + this.defaultFileDir = defaultFileDir; } @SuppressWarnings({"rawtypes", "unchecked"}) @Override public List getQuestions() throws QuestionsFileLoadingException { - String csvFilename = localisationService.getValue("csv.file.name"); - - if (csvFilename == null) { - throw new QuestionsFileLoadingException(localisationService.getValue("questions.load.null.filename")); - } - - List questions = new ArrayList(); + String csvFilename = defaultFileDir + "/" + localisationService.getValue("csv.file.name"); + List questions; try { - URL url = getClass().getResource("/" + csvFilename); - if (url == null) { - throw new QuestionsFileLoadingException( - localisationService.getValueWithParams("questions.load.error.filename", new String[] {csvFilename}) - ); - } - - File file = new File(url.toURI()); - CSVReader csvReader=new CSVReader(new InputStreamReader(new FileInputStream(file), "UTF-8")); - CsvToBean csv = new CsvToBean(); - - questions = csv.parse(setColumMapping(), csvReader); + ClassPathResource resource = new ClassPathResource(csvFilename); + CSVReader csvReader = new CSVReader(new InputStreamReader(resource.getInputStream(), "UTF-8")); + questions = new CsvToBean().parse(setColumMapping(), csvReader); } catch (FileNotFoundException e) { throw new QuestionsFileLoadingException(localisationService.getValueWithParams("questions.find.error.filename", new String[] {csvFilename}), e); - } catch (URISyntaxException e) { - throw new QuestionsFileLoadingException(localisationService.getValue("questions.read.error"), e); } catch (UnsupportedEncodingException e) { throw new QuestionsFileLoadingException(localisationService.getValue("questions.encoding.error"), e); + } catch (IOException e) { + throw new QuestionsFileLoadingException(localisationService.getValue("questions.io.error"), e); } return questions; } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index f676796..c6450d1 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,3 +1,5 @@ locale.basename=/i18n/bundle locale.default.encoding=UTF-8 -locale.default=ru \ No newline at end of file +locale.default=ru + +questions.default.dir=/questions \ No newline at end of file diff --git a/src/main/resources/i18n/bundle_en.properties b/src/main/resources/i18n/bundle_en.properties index be4e3ea..9907680 100644 --- a/src/main/resources/i18n/bundle_en.properties +++ b/src/main/resources/i18n/bundle_en.properties @@ -1,5 +1,4 @@ count.true.answers=Number of correct answers: {0} of {1} -csv.file.name=questions/en.csv enter.answer=Enter answer number: enter.your.data=Enter your data enter.your.name=Name: @@ -7,6 +6,6 @@ enter.your.surname=Surname: hello.user=Hello, {0} {1}! questions.encoding.error=File encoding error! questions.find.error.filename=File named {0} not found! -questions.load.error.filename=Error loading file named {0}! -questions.load.null.filename=The file name cannot be null! -questions.read.error=File read error! \ No newline at end of file +questions.io.error=Error I/O when working with a file! + +csv.file.name=en.csv diff --git a/src/main/resources/i18n/bundle_ru.properties b/src/main/resources/i18n/bundle_ru.properties index 5ab475f..5ff9c0a 100644 --- a/src/main/resources/i18n/bundle_ru.properties +++ b/src/main/resources/i18n/bundle_ru.properties @@ -1,5 +1,4 @@ count.true.answers=Количество правильных ответов: {0} из {1} -csv.file.name=questions/ru.csv enter.answer=Введите номер ответа: enter.your.data=Введите свои данные enter.your.name=Имя: @@ -7,6 +6,6 @@ enter.your.surname=Фамилия: hello.user=Здравствуйте, {0} {1}! questions.encoding.error=Ошибка кодировки файла! questions.find.error.filename=Файл с именем {0} не найден! -questions.load.error.filename=Ошибка загрузки файла с именем {0}! -questions.load.null.filename=Имя файла не может быть null! -questions.read.error=Ошибка чтения файла! \ No newline at end of file +questions.io.error=Ошибка ввода/вывода при работе с файлом! + +csv.file.name=ru.csv diff --git a/src/test/java/ru/otus/mkulikov/model/QuestionTest.java b/src/test/java/ru/otus/mkulikov/model/QuestionTest.java deleted file mode 100644 index f4f2074..0000000 --- a/src/test/java/ru/otus/mkulikov/model/QuestionTest.java +++ /dev/null @@ -1,47 +0,0 @@ -package ru.otus.mkulikov.model; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import ru.otus.mkulikov.models.Question; - -import static org.junit.jupiter.api.Assertions.assertAll; -import static org.junit.jupiter.api.Assertions.assertEquals; - -/** - * Created by IntelliJ IDEA. - * Developer: Maksim Kulikov - * Date: 2019-03-18 - * Time: 11:13 - */ - -@DisplayName("Класс Question") -class QuestionTest { - - private final String c_id = "1"; - private final String c_question = "Question"; - private final String c_userAnswer = "UserAnswer"; - private final String c_trueAnswer = "TrueAnswer"; - private final String c_answer1 = "Answer1"; - private final String c_answer2 = "Answer2"; - private final String c_answer3 = "Answer3"; - private final String c_answer4 = "Answer4"; - - @Test - @DisplayName("Корректное заполнение") - public void fillQuestionTest() { - Question question = new Question( - c_id, c_question, c_answer1, c_answer2, c_answer3, c_answer4, c_trueAnswer, c_userAnswer - ); - - assertAll("question", - () -> assertEquals(c_id, question.getId()), - () -> assertEquals(c_question, question.getQuestion()), - () -> assertEquals(c_userAnswer, question.getUserAnswer()), - () -> assertEquals(c_trueAnswer, question.getTrueAnswer()), - () -> assertEquals(c_answer1, question.getAnswer1()), - () -> assertEquals(c_answer2, question.getAnswer2()), - () -> assertEquals(c_answer3, question.getAnswer3()), - () -> assertEquals(c_answer4, question.getAnswer4()) - ); - } -} \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/model/UserTest.java b/src/test/java/ru/otus/mkulikov/model/UserTest.java deleted file mode 100644 index b1982fe..0000000 --- a/src/test/java/ru/otus/mkulikov/model/UserTest.java +++ /dev/null @@ -1,34 +0,0 @@ -package ru.otus.mkulikov.model; - -import org.assertj.core.api.Assertions; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import ru.otus.mkulikov.models.User; - -import static org.junit.jupiter.api.Assertions.*; - -/** - * Created by IntelliJ IDEA. - * Developer: Maksim Kulikov - * Date: 2019-03-18 - * Time: 10:57 - */ - -@DisplayName("Класс User") -class UserTest { - - private final String c_userName = "Name"; - private final String c_userSurname = "Surname"; - - @Test - @DisplayName("Корректное создание") - public void createUserTest() { - User user = new User(c_userName, c_userSurname); - assertAll("user", - () -> assertEquals(c_userName, user.getName()), - () -> assertEquals(c_userSurname, user.getSurname()) - ); - - Assertions.assertThat(user).hasFieldOrPropertyWithValue("name", c_userName); - } -} \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java b/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java index adb2665..0b384fc 100644 --- a/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java +++ b/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java @@ -16,7 +16,7 @@ class QuestionsDAOTest { private final LocalisationServiceImpl localisationService = new LocalisationServiceImpl("/i18n/bundle", "UTF-8", "ru"); - private final QuestionsDAO questionsDAO = new QuestionsDAOImpl(localisationService); + private final QuestionsDAO questionsDAO = new QuestionsDAOImpl(localisationService, "/questions"); private final String c_test1 = "Тест1"; private final String c_test2 = "Тест2"; From 00bc9bddf668cfe0163356f5e2baa548f1240611 Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Fri, 22 Mar 2019 01:44:28 +0300 Subject: [PATCH 13/15] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=B8=D0=BD=D0=B3.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../services/localisation/LocalisationServiceImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/ru/otus/mkulikov/services/localisation/LocalisationServiceImpl.java b/src/main/java/ru/otus/mkulikov/services/localisation/LocalisationServiceImpl.java index 9c9d4ff..2af1b75 100644 --- a/src/main/java/ru/otus/mkulikov/services/localisation/LocalisationServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/services/localisation/LocalisationServiceImpl.java @@ -17,7 +17,7 @@ public class LocalisationServiceImpl extends ReloadableResourceBundleMessageSource implements LocalisationService { private final Locale locale; - public static final Locale RUSSIAN = new Locale("ru"); + private final Locale russian = new Locale("ru"); public LocalisationServiceImpl( @Value("${locale.basename}") String basename, @@ -30,7 +30,7 @@ public LocalisationServiceImpl( locale = (localeDefault != null) ? new Locale(localeDefault) - : RUSSIAN; + : russian; } public String getValue(String key) { From e2ba5e0da661fda21d718ff0757a2312e6135fe5 Mon Sep 17 00:00:00 2001 From: "maxim.kulikov" Date: Fri, 22 Mar 2019 15:30:28 +0300 Subject: [PATCH 14/15] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=84=D0=B0=D0=B9=D0=BB=D0=BE=D0=B2?= =?UTF-8?q?=20=D0=BD=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B5=D0=BA=20=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=20=D1=82=D0=B5=D1=81=D1=82=D0=BE=D0=B2.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 8 ++ .../mkulikov/questions/QuestionsDAOTest.java | 31 ++++++- .../LocalisationServiceImplTest.java | 89 +++++++++++++++++++ .../resources/locale/bundle_en.properties | 14 +++ .../resources/locale/bundle_ru.properties | 14 +++ src/test/resources/test.properties | 6 ++ 6 files changed, 160 insertions(+), 2 deletions(-) create mode 100644 src/test/java/ru/otus/mkulikov/services/localisation/LocalisationServiceImplTest.java create mode 100644 src/test/resources/locale/bundle_en.properties create mode 100644 src/test/resources/locale/bundle_ru.properties create mode 100644 src/test/resources/test.properties diff --git a/pom.xml b/pom.xml index bbb1616..ae8c2f6 100644 --- a/pom.xml +++ b/pom.xml @@ -83,6 +83,14 @@ 1.18.4 provided + + + + org.mockito + mockito-all + 1.10.19 + test + diff --git a/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java b/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java index 0b384fc..4e0bd8e 100644 --- a/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java +++ b/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java @@ -1,7 +1,14 @@ package ru.otus.mkulikov.questions; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import ru.otus.mkulikov.Application; import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; import ru.otus.mkulikov.models.Question; import ru.otus.mkulikov.services.localisation.LocalisationServiceImpl; @@ -13,15 +20,35 @@ import static org.junit.jupiter.api.Assertions.*; @DisplayName("Класс QuestionsDAO") +@ExtendWith(SpringExtension.class) +@ContextConfiguration(classes = Application.class) +@TestPropertySource("/test.properties") class QuestionsDAOTest { - private final LocalisationServiceImpl localisationService = new LocalisationServiceImpl("/i18n/bundle", "UTF-8", "ru"); - private final QuestionsDAO questionsDAO = new QuestionsDAOImpl(localisationService, "/questions"); + private LocalisationServiceImpl localisationService; + private QuestionsDAO questionsDAO; + + @Value("${test.basename}") + private String folder; + @Value("${test.default.encoding}") + private String encoding; + @Value("${test.default.ru}") + private String ru; + @Value("${test.default.en}") + private String en; + @Value("${test.question.folder}") + private String questionFolder; private final String c_test1 = "Тест1"; private final String c_test2 = "Тест2"; private final String c_test3 = "Тест3"; + @BeforeEach + void init() { + localisationService = new LocalisationServiceImpl(folder, encoding, ru); + questionsDAO = new QuestionsDAOImpl(localisationService, questionFolder); + } + @Test @DisplayName("Корректная загрузка вопросов") public void loadQuestionsTest() throws QuestionsFileLoadingException { diff --git a/src/test/java/ru/otus/mkulikov/services/localisation/LocalisationServiceImplTest.java b/src/test/java/ru/otus/mkulikov/services/localisation/LocalisationServiceImplTest.java new file mode 100644 index 0000000..1b9b76e --- /dev/null +++ b/src/test/java/ru/otus/mkulikov/services/localisation/LocalisationServiceImplTest.java @@ -0,0 +1,89 @@ +package ru.otus.mkulikov.services.localisation; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import ru.otus.mkulikov.Application; + +import static org.junit.jupiter.api.Assertions.*; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 2019-03-22 + * Time: 13:58 + */ + +@DisplayName("Класс LocalisationServiceImpl") +@ExtendWith(SpringExtension.class) +@ContextConfiguration(classes = Application.class) +@TestPropertySource("/test.properties") +class LocalisationServiceImplTest { + + @Value("${test.basename}") + private String folder; + @Value("${test.default.encoding}") + private String encoding; + @Value("${test.default.ru}") + private String ru; + @Value("${test.default.en}") + private String en; + + private LocalisationService ruLocale; + private LocalisationService enLocale; + + @BeforeEach + void init() { + ruLocale = new LocalisationServiceImpl(folder, encoding, ru); + enLocale = new LocalisationServiceImpl(folder, encoding, en); + } + + @Test + @DisplayName("Проверка получения значения ru локали") + void getValueRuTest() { + String value = ruLocale.getValue("test.key"); + + assertAll("value", + () -> assertNotNull(value), + () -> assertEquals("тест123", value) + ); + } + + @Test + @DisplayName("Проверка получения значения en локали") + void getValueEnTest() { + String value = enLocale.getValue("test.key"); + + assertAll("value", + () -> assertNotNull(value), + () -> assertEquals("test123", value) + ); + } + + @Test + @DisplayName("Проверка получения значения ru локали с параметром") + void getValueRuWithParamsTest() { + String value = ruLocale.getValueWithParams("test.key.params", new String[]{"При", "вет"}); + + assertAll("value", + () -> assertNotNull(value), + () -> assertEquals("При и вет - Привет", value) + ); + } + + @Test + @DisplayName("Проверка получения значения en локали с параметром") + void getValueEnWithParamsTest() { + String value = enLocale.getValueWithParams("test.key.params", new String[]{"Hel", "lo"}); + + assertAll("value", + () -> assertNotNull(value), + () -> assertEquals("Hel & lo - Hello", value) + ); + } +} \ No newline at end of file diff --git a/src/test/resources/locale/bundle_en.properties b/src/test/resources/locale/bundle_en.properties new file mode 100644 index 0000000..4c04204 --- /dev/null +++ b/src/test/resources/locale/bundle_en.properties @@ -0,0 +1,14 @@ +count.true.answers=Number of correct answers: {0} of {1} +enter.answer=Enter answer number: +enter.your.data=Enter your data +enter.your.name=Name: +enter.your.surname=Surname: +hello.user=Hello, {0} {1}! +questions.encoding.error=File encoding error! +questions.find.error.filename=File named {0} not found! +questions.io.error=Error I/O when working with a file! + +csv.file.name=en.csv + +test.key=test123 +test.key.params={0} & {1} - Hello \ No newline at end of file diff --git a/src/test/resources/locale/bundle_ru.properties b/src/test/resources/locale/bundle_ru.properties new file mode 100644 index 0000000..2fc5bc9 --- /dev/null +++ b/src/test/resources/locale/bundle_ru.properties @@ -0,0 +1,14 @@ +count.true.answers=Количество правильных ответов: {0} из {1} +enter.answer=Введите номер ответа: +enter.your.data=Введите свои данные +enter.your.name=Имя: +enter.your.surname=Фамилия: +hello.user=Здравствуйте, {0} {1}! +questions.encoding.error=Ошибка кодировки файла! +questions.find.error.filename=Файл с именем {0} не найден! +questions.io.error=Ошибка ввода/вывода при работе с файлом! + +csv.file.name=ru.csv + +test.key=тест123 +test.key.params={0} и {1} - Привет \ No newline at end of file diff --git a/src/test/resources/test.properties b/src/test/resources/test.properties new file mode 100644 index 0000000..ea04e2e --- /dev/null +++ b/src/test/resources/test.properties @@ -0,0 +1,6 @@ +test.basename=/locale/bundle +test.default.encoding=UTF-8 +test.default.ru=ru +test.default.en=en + +test.question.folder=/questions From 998fed3c607a1c0130efe6c6f40c7d3b392f02aa Mon Sep 17 00:00:00 2001 From: "maxim.kulikov" Date: Fri, 22 Mar 2019 15:36:36 +0300 Subject: [PATCH 15/15] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=B8=D0=BD=D0=B3.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + .../otus/mkulikov/questions/QuestionsDAOTest.java | 12 +++--------- .../localisation/LocalisationServiceImplTest.java | 13 ++++--------- 3 files changed, 8 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index 2af3090..74e0743 100644 --- a/README.md +++ b/README.md @@ -9,3 +9,4 @@ - Убраны лишние тесты. - Изменена работа с файлом. - Использование @Data вместо @Getter, @Setter. +- Добавлены *.properties для тестов. diff --git a/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java b/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java index 4e0bd8e..a9bb600 100644 --- a/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java +++ b/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java @@ -25,9 +25,6 @@ @TestPropertySource("/test.properties") class QuestionsDAOTest { - private LocalisationServiceImpl localisationService; - private QuestionsDAO questionsDAO; - @Value("${test.basename}") private String folder; @Value("${test.default.encoding}") @@ -43,15 +40,12 @@ class QuestionsDAOTest { private final String c_test2 = "Тест2"; private final String c_test3 = "Тест3"; - @BeforeEach - void init() { - localisationService = new LocalisationServiceImpl(folder, encoding, ru); - questionsDAO = new QuestionsDAOImpl(localisationService, questionFolder); - } - @Test @DisplayName("Корректная загрузка вопросов") public void loadQuestionsTest() throws QuestionsFileLoadingException { + LocalisationServiceImpl localisationService = new LocalisationServiceImpl(folder, encoding, ru); + QuestionsDAO questionsDAO = new QuestionsDAOImpl(localisationService, questionFolder); + List questions = questionsDAO.getQuestions(); assertAll("questions", diff --git a/src/test/java/ru/otus/mkulikov/services/localisation/LocalisationServiceImplTest.java b/src/test/java/ru/otus/mkulikov/services/localisation/LocalisationServiceImplTest.java index 1b9b76e..2984838 100644 --- a/src/test/java/ru/otus/mkulikov/services/localisation/LocalisationServiceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/services/localisation/LocalisationServiceImplTest.java @@ -34,18 +34,10 @@ class LocalisationServiceImplTest { @Value("${test.default.en}") private String en; - private LocalisationService ruLocale; - private LocalisationService enLocale; - - @BeforeEach - void init() { - ruLocale = new LocalisationServiceImpl(folder, encoding, ru); - enLocale = new LocalisationServiceImpl(folder, encoding, en); - } - @Test @DisplayName("Проверка получения значения ru локали") void getValueRuTest() { + LocalisationService ruLocale = new LocalisationServiceImpl(folder, encoding, ru); String value = ruLocale.getValue("test.key"); assertAll("value", @@ -57,6 +49,7 @@ void getValueRuTest() { @Test @DisplayName("Проверка получения значения en локали") void getValueEnTest() { + LocalisationService enLocale = new LocalisationServiceImpl(folder, encoding, en); String value = enLocale.getValue("test.key"); assertAll("value", @@ -68,6 +61,7 @@ void getValueEnTest() { @Test @DisplayName("Проверка получения значения ru локали с параметром") void getValueRuWithParamsTest() { + LocalisationService ruLocale = new LocalisationServiceImpl(folder, encoding, ru); String value = ruLocale.getValueWithParams("test.key.params", new String[]{"При", "вет"}); assertAll("value", @@ -79,6 +73,7 @@ void getValueRuWithParamsTest() { @Test @DisplayName("Проверка получения значения en локали с параметром") void getValueEnWithParamsTest() { + LocalisationService enLocale = new LocalisationServiceImpl(folder, encoding, en); String value = enLocale.getValueWithParams("test.key.params", new String[]{"Hel", "lo"}); assertAll("value",