diff --git a/2020-11/junit/.gitignore b/2020-11/junit/.gitignore
new file mode 100644
index 00000000..4ea52072
--- /dev/null
+++ b/2020-11/junit/.gitignore
@@ -0,0 +1,24 @@
+target/
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/build/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
diff --git a/2020-11/junit/pom.xml b/2020-11/junit/pom.xml
new file mode 100644
index 00000000..6184cf4f
--- /dev/null
+++ b/2020-11/junit/pom.xml
@@ -0,0 +1,38 @@
+
+
+ 4.0.0
+
+ ru.otus
+ junit
+ 1.0
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.3.0.RELEASE
+
+
+
+
+ 11
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+ org.junit.vintage
+ junit-vintage-engine
+
+
+
+
+
diff --git a/2020-11/junit/src/main/java/ru/otus/junit/dao/PersonDao.java b/2020-11/junit/src/main/java/ru/otus/junit/dao/PersonDao.java
new file mode 100644
index 00000000..6ff0d1ef
--- /dev/null
+++ b/2020-11/junit/src/main/java/ru/otus/junit/dao/PersonDao.java
@@ -0,0 +1,16 @@
+package ru.otus.junit.dao;
+
+import ru.otus.junit.domain.Person;
+
+import java.util.List;
+
+public interface PersonDao {
+
+ Person getByName(String name) throws PersonNotFoundException;
+
+ List getAll();
+
+ void deleteByName(String name) throws PersonNotFoundException;
+
+ void save(Person person);
+}
diff --git a/2020-11/junit/src/main/java/ru/otus/junit/dao/PersonDaoImpl.java b/2020-11/junit/src/main/java/ru/otus/junit/dao/PersonDaoImpl.java
new file mode 100644
index 00000000..59aa9b5d
--- /dev/null
+++ b/2020-11/junit/src/main/java/ru/otus/junit/dao/PersonDaoImpl.java
@@ -0,0 +1,36 @@
+package ru.otus.junit.dao;
+
+import ru.otus.junit.domain.Person;
+
+import java.util.List;
+
+public class PersonDaoImpl implements PersonDao {
+
+ // здесь будет поле - список Person-ов
+
+ @Override
+ public Person getByName(String name) throws PersonNotFoundException {
+ // TODO: реализовать поиск в списке по имени (по технике Test-First)
+ // TODO: да, этот метод может бросать Exception, и это нужно покрыть другим тестом
+ return null;
+ }
+
+ @Override
+ public List getAll() {
+ // TODO: реализовать получние всех Person (по технике Test-First)
+ return null;
+ }
+
+ @Override
+ public void deleteByName(String name) throws PersonNotFoundException {
+ // TODO: реализовать удаление по имени (по технике Test-First)
+ // TODO: да, этот метод может бросать Exception, и это нужно покрыть другим тестом
+ }
+
+ @Override
+ public void save(Person person) {
+ // TODO: этот метод должен найти по имени в списке
+ // TODO: если такой есть - заменить
+ // TODO: если такого нет - добавить
+ }
+}
diff --git a/2020-11/junit/src/main/java/ru/otus/junit/dao/PersonNotFoundException.java b/2020-11/junit/src/main/java/ru/otus/junit/dao/PersonNotFoundException.java
new file mode 100644
index 00000000..12f78d77
--- /dev/null
+++ b/2020-11/junit/src/main/java/ru/otus/junit/dao/PersonNotFoundException.java
@@ -0,0 +1,8 @@
+package ru.otus.junit.dao;
+
+public class PersonNotFoundException extends RuntimeException {
+
+ public PersonNotFoundException(String message) {
+ super(message);
+ }
+}
diff --git a/2020-11/junit/src/main/java/ru/otus/junit/domain/Person.java b/2020-11/junit/src/main/java/ru/otus/junit/domain/Person.java
new file mode 100644
index 00000000..10d5294c
--- /dev/null
+++ b/2020-11/junit/src/main/java/ru/otus/junit/domain/Person.java
@@ -0,0 +1,32 @@
+package ru.otus.junit.domain;
+
+@SuppressWarnings({"WeakerAccess", "unused"})
+public class Person {
+
+ private int age;
+ private String name;
+
+ public Person(int age, String name) {
+ this.age = age;
+ this.name = name;
+ }
+
+ public int getAge() {
+ return age;
+ }
+
+ public void setAge(int age) {
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public void birthDay() {
+ this.age++;
+ }
+}
diff --git a/2020-11/junit/src/main/java/ru/otus/junit/service/PersonService.java b/2020-11/junit/src/main/java/ru/otus/junit/service/PersonService.java
new file mode 100644
index 00000000..0cb144f1
--- /dev/null
+++ b/2020-11/junit/src/main/java/ru/otus/junit/service/PersonService.java
@@ -0,0 +1,16 @@
+package ru.otus.junit.service;
+
+import ru.otus.junit.domain.Person;
+
+import java.util.List;
+
+public interface PersonService {
+
+ Person getByName(String name);
+
+ List getAll();
+
+ boolean existsWithName(String name);
+
+ void save(Person p);
+}
diff --git a/2020-11/junit/src/main/java/ru/otus/junit/service/PersonServiceImpl.java b/2020-11/junit/src/main/java/ru/otus/junit/service/PersonServiceImpl.java
new file mode 100644
index 00000000..52b82f10
--- /dev/null
+++ b/2020-11/junit/src/main/java/ru/otus/junit/service/PersonServiceImpl.java
@@ -0,0 +1,37 @@
+package ru.otus.junit.service;
+
+import ru.otus.junit.dao.PersonDao;
+import ru.otus.junit.domain.Person;
+
+import java.util.List;
+
+public class PersonServiceImpl implements PersonService {
+
+ private final PersonDao dao;
+
+ PersonServiceImpl(PersonDao dao) {
+ this.dao = dao;
+ }
+
+ @Override
+ public Person getByName(String name) {
+ return dao.getByName(name);
+ }
+
+ @Override
+ public List getAll() {
+ // TODO: реализовать данный метод по технике Test-First
+ return null;
+ }
+
+ @Override
+ public boolean existsWithName(String name) {
+ // TODO: реализовать данный метод по технике Test-First
+ return false;
+ }
+
+ @Override
+ public void save(Person p) {
+ // TODO: реализовать данный метод по технике Test-First
+ }
+}
diff --git a/2020-11/junit/src/test/java/ru/otus/junit/domain/PersonTest.java b/2020-11/junit/src/test/java/ru/otus/junit/domain/PersonTest.java
new file mode 100644
index 00000000..30366c3f
--- /dev/null
+++ b/2020-11/junit/src/test/java/ru/otus/junit/domain/PersonTest.java
@@ -0,0 +1,23 @@
+package ru.otus.junit.domain;
+
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+@DisplayName("Класс Person")
+class PersonTest {
+
+ @DisplayName("корректно создаётся конструктором")
+ @Test
+ void shouldHaveCorrectConstructor() {
+ Person person = new Person(42, "Ivan");
+
+ assertEquals("Ivan", person.getName());
+ assertEquals(42, person.getAge());
+ }
+
+ // TODO: @DisplayName("должен")
+
+ // TODO: @DisplayName("должен увеличивать возраст при вызове birthDay")
+}
diff --git a/2020-11/junit/src/test/java/ru/otus/junit/service/PersonServiceImplTest.java b/2020-11/junit/src/test/java/ru/otus/junit/service/PersonServiceImplTest.java
new file mode 100644
index 00000000..47fa7a7e
--- /dev/null
+++ b/2020-11/junit/src/test/java/ru/otus/junit/service/PersonServiceImplTest.java
@@ -0,0 +1,37 @@
+package ru.otus.junit.service;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+import ru.otus.junit.dao.PersonDao;
+import ru.otus.junit.domain.Person;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.BDDMockito.given;
+
+@ExtendWith(MockitoExtension.class)
+class PersonServiceImplTest {
+
+ @Mock
+ private PersonDao personDao;
+
+ private PersonService personService;
+
+ @BeforeEach
+ void setUp() {
+ personService = new PersonServiceImpl(personDao);
+ }
+
+ @Test
+ void getByName() {
+ // TODO: используйте eq() mapper вместо any()
+ given(personDao.getByName(any()))
+ .willReturn(new Person(10, "Ivan"));
+
+ assertThat(personService.getByName("Ivan"))
+ .isNotNull(); // TODO: сравните с помощью equals
+ }
+}
diff --git a/2020-11/spring-01/.gitignore b/2020-11/spring-01/.gitignore
new file mode 100644
index 00000000..4ea52072
--- /dev/null
+++ b/2020-11/spring-01/.gitignore
@@ -0,0 +1,24 @@
+target/
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/build/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
diff --git a/2020-11/spring-01/pom.xml b/2020-11/spring-01/pom.xml
new file mode 100644
index 00000000..6658aaa0
--- /dev/null
+++ b/2020-11/spring-01/pom.xml
@@ -0,0 +1,17 @@
+
+
+ 4.0.0
+
+ ru.otus
+ spring-01
+ 1.0
+
+ pom
+
+
+ spring-01-exercise
+ spring-01-solution
+
+
diff --git a/2020-11/spring-01/spring-01-exercise/pom.xml b/2020-11/spring-01/spring-01-exercise/pom.xml
new file mode 100644
index 00000000..e3aa2772
--- /dev/null
+++ b/2020-11/spring-01/spring-01-exercise/pom.xml
@@ -0,0 +1,20 @@
+
+
+ 4.0.0
+
+ ru.otus
+ spring-01-exercise
+ 1.0
+
+
+ 11
+ 11
+ UTF-8
+
+
+
+
+
+
diff --git a/2020-11/spring-01/spring-01-exercise/src/main/java/ru/otus/spring/Main.java b/2020-11/spring-01/spring-01-exercise/src/main/java/ru/otus/spring/Main.java
new file mode 100644
index 00000000..e3201a16
--- /dev/null
+++ b/2020-11/spring-01/spring-01-exercise/src/main/java/ru/otus/spring/Main.java
@@ -0,0 +1,17 @@
+package ru.otus.spring;
+
+//import org.springframework.context.support.ClassPathXmlApplicationContext;
+import ru.otus.spring.domain.Person;
+
+public class Main {
+
+ public static void main(String[] args) {
+ // TODO: создайте здесь класс контекста
+
+ // TODO: Получите Person Service
+
+ // Получите Person "Ivan"
+ Person ivan = null;
+ System.out.println("name: " + ivan.getName() + " age: " + ivan.getAge());
+ }
+}
diff --git a/2020-11/spring-01/spring-01-exercise/src/main/java/ru/otus/spring/dao/PersonDao.java b/2020-11/spring-01/spring-01-exercise/src/main/java/ru/otus/spring/dao/PersonDao.java
new file mode 100644
index 00000000..d33939bd
--- /dev/null
+++ b/2020-11/spring-01/spring-01-exercise/src/main/java/ru/otus/spring/dao/PersonDao.java
@@ -0,0 +1,8 @@
+package ru.otus.spring.dao;
+
+import ru.otus.spring.domain.Person;
+
+public interface PersonDao {
+
+ Person findByName(String name);
+}
diff --git a/2020-11/spring-01/spring-01-exercise/src/main/java/ru/otus/spring/dao/PersonDaoSimple.java b/2020-11/spring-01/spring-01-exercise/src/main/java/ru/otus/spring/dao/PersonDaoSimple.java
new file mode 100644
index 00000000..7f7c97c6
--- /dev/null
+++ b/2020-11/spring-01/spring-01-exercise/src/main/java/ru/otus/spring/dao/PersonDaoSimple.java
@@ -0,0 +1,10 @@
+package ru.otus.spring.dao;
+
+import ru.otus.spring.domain.Person;
+
+public class PersonDaoSimple implements PersonDao {
+
+ public Person findByName(String name) {
+ return new Person(name, 18);
+ }
+}
diff --git a/2020-11/spring-01/spring-01-exercise/src/main/java/ru/otus/spring/domain/Person.java b/2020-11/spring-01/spring-01-exercise/src/main/java/ru/otus/spring/domain/Person.java
new file mode 100644
index 00000000..c23be0c6
--- /dev/null
+++ b/2020-11/spring-01/spring-01-exercise/src/main/java/ru/otus/spring/domain/Person.java
@@ -0,0 +1,20 @@
+package ru.otus.spring.domain;
+
+public class Person {
+
+ private final String name;
+ private final int age;
+
+ public Person(String name, int age) {
+ this.name = name;
+ this.age = age;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public int getAge() {
+ return age;
+ }
+}
diff --git a/2020-11/spring-01/spring-01-exercise/src/main/java/ru/otus/spring/service/PersonService.java b/2020-11/spring-01/spring-01-exercise/src/main/java/ru/otus/spring/service/PersonService.java
new file mode 100644
index 00000000..9b83e7de
--- /dev/null
+++ b/2020-11/spring-01/spring-01-exercise/src/main/java/ru/otus/spring/service/PersonService.java
@@ -0,0 +1,8 @@
+package ru.otus.spring.service;
+
+import ru.otus.spring.domain.Person;
+
+public interface PersonService {
+
+ Person getByName(String name);
+}
diff --git a/2020-11/spring-01/spring-01-exercise/src/main/java/ru/otus/spring/service/PersonServiceImpl.java b/2020-11/spring-01/spring-01-exercise/src/main/java/ru/otus/spring/service/PersonServiceImpl.java
new file mode 100644
index 00000000..794c29dd
--- /dev/null
+++ b/2020-11/spring-01/spring-01-exercise/src/main/java/ru/otus/spring/service/PersonServiceImpl.java
@@ -0,0 +1,17 @@
+package ru.otus.spring.service;
+
+import ru.otus.spring.dao.PersonDao;
+import ru.otus.spring.domain.Person;
+
+public class PersonServiceImpl implements PersonService {
+
+ private final PersonDao dao;
+
+ public PersonServiceImpl(PersonDao dao) {
+ this.dao = dao;
+ }
+
+ public Person getByName(String name) {
+ return dao.findByName(name);
+ }
+}
diff --git a/2020-11/spring-01/spring-01-exercise/src/main/resources/spring-context.xml b/2020-11/spring-01/spring-01-exercise/src/main/resources/spring-context.xml
new file mode 100644
index 00000000..2cb9eabe
--- /dev/null
+++ b/2020-11/spring-01/spring-01-exercise/src/main/resources/spring-context.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+