diff --git a/README.md b/README.md
index eb76daf..4c489f5 100644
--- a/README.md
+++ b/README.md
@@ -1 +1,30 @@
-# spring-core-template
\ No newline at end of file
+# Шаблон для практической работы по теме Spring Core
+
+### Задание
+1. В `pom.xml` добавьте зависимость `org.springframework:spring-context:5.2.1.RELEASE`.
+
+1. В методе main создайте новый экземпляр класса `AnnotationConfigApplicationContext` - контейнер, в котором
+будут храниться ваши бины. На вход ему будет передаваться класс `MainConfiguration`. В конфигурации используйте такие
+аннотации, как `@Configuration` и `@Bean`.
+
+1. В классе `MainConfiguration` сделайте импорт двух других классов-конфигураций:
+ * В классе `RepositoryConfiguration` сделайте описание бинов `ArrayListItemRepository` и `LinkedListItemRepository`
+ 1. В `ArrayListItemRepository` объекты `Item` должны храниться в `ArrayList` и `initialSequence` считываться из пропертей.
+ 1. В `ArrayListItemRepository` объекты `Item` должны храниться в `LinkedList` и `initialSequence` генерироваться случайно.
+ * В классе `InitializerConfiguration` реализуйте factory-bean `ColorFactory`, который умеет выдавать сущности
+ бинов `Color` по запросу `getColor`. Бин `Color` обязан создаваться каждый раз заново.
+
+1. Имплементируйте `SimpleItemService` - сделайте так, чтобы необходимые зависимости добавлялись к нему через метод `set..`
+и конструктор. В чём разница этих подходов?
+
+1. Сделайте так, чтобы бин `ColorFactory` создавался не на этапе создания контекста, а при первом обращении к нему.
+
+1. Сделайте так, чтобы используемая реализация `ItemRepository` выбиралась исходя из проперти `item.repository.implementation`
+из значений `array` или `linked`. При отсутствии проперти необходимо использовать `ArrayListItemRepository`.
+
+1. В классе `SpringCoreTemplate` в методе `main` создайте экземпляр `ApplicationContext` и передайте ему на вход
+созданный экземпляр `AnnotationConfigApplicationContext`. Сделайте парочку вызовов метода `getBean`, чтобы убедиться,
+что все бины создались и корректно работают.
+
+1. Подключите зависимость `org.springframework:spring-test:jar:5.2.1.RELEASE`. Напишите тесты, которые проверяют основную
+бизнес-логику и то, что ваш контекст загружается успешно.
diff --git a/pom.xml b/pom.xml
index a98d368..bd8e1e8 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,43 +1,94 @@
-
- 4.0.0
-
- org.springframework.boot
- spring-boot-starter-parent
- 2.1.6.RELEASE
-
-
- com.epam.edu
- spring-core-template
- 0.0.1-SNAPSHOT
- spring-core-template
- Demo project for Spring Boot
+
+ 4.0.0
-
- 1.8
-
+ com.EvDroid
+ spring-core-template
+ 1.0-SNAPSHOT
-
-
- org.springframework.boot
- spring-boot-starter
-
+
+ 8
+ 8
+
+ 5.3.29
+ 5.3.29
+
+ 5.10.0
+ 1.10.0
+
+ 3.1.2
+
+ 3.1.2
+
-
- org.springframework.boot
- spring-boot-starter-test
- test
-
-
-
-
-
-
- org.springframework.boot
- spring-boot-maven-plugin
-
-
-
-
-
+
+
+ org.springframework
+ spring-context
+ ${spring-context.version}
+
+
+ org.springframework
+ spring-test
+ ${spring-test-version}
+ test
+
+
+ org.junit.jupiter
+ junit-jupiter-api
+ test
+
+
+ org.junit.jupiter
+ junit-jupiter-params
+ test
+
+
+ org.junit.platform
+ junit-platform-launcher
+ ${junit-platform-launcher.version}
+ test
+
+
+
+
+
+ org.junit
+ junit-bom
+ ${junit-bom.version}
+ pom
+ import
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+ ${maven-surefire-plugin.version}
+
+ true
+
+
+ junit.platform.output.capture.stdout=true
+ junit.platform.output.capture.stderr=true
+ junit.platform.output.capture.maxBuffer=8192
+
+
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-report-plugin
+ ${maven-surefire-report-plugin.version}
+
+
+
+
\ No newline at end of file
diff --git a/src/main/java/com/epam/edu/spring/core/template/SpringCoreTemplate.java b/src/main/java/com/epam/edu/spring/core/template/SpringCoreTemplate.java
index 7d6ea06..c64bf01 100644
--- a/src/main/java/com/epam/edu/spring/core/template/SpringCoreTemplate.java
+++ b/src/main/java/com/epam/edu/spring/core/template/SpringCoreTemplate.java
@@ -1,14 +1,12 @@
package com.epam.edu.spring.core.template;
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
+import com.epam.edu.spring.core.template.configuration.MainConfiguration;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.annotation.AnnotationConfigApplicationContext;
-@SpringBootApplication
public class SpringCoreTemplate {
- public static void main(String[] args) {
- SpringApplication.run(SpringCoreTemplate.class, args);
- //TODO get service bean and do some business logic with DTO`s
- }
-
+ public static void main(String[] args) {
+ ApplicationContext context = new AnnotationConfigApplicationContext(MainConfiguration.class);
+ }
}
diff --git a/src/main/java/com/epam/edu/spring/core/template/configuration/InitializerConfiguration.java b/src/main/java/com/epam/edu/spring/core/template/configuration/InitializerConfiguration.java
new file mode 100644
index 0000000..4eb25f5
--- /dev/null
+++ b/src/main/java/com/epam/edu/spring/core/template/configuration/InitializerConfiguration.java
@@ -0,0 +1,20 @@
+package com.epam.edu.spring.core.template.configuration;
+
+import com.epam.edu.spring.core.template.factory.ColorFactoryBean;
+import com.epam.edu.spring.core.template.entity.Color;
+import org.springframework.beans.factory.config.BeanDefinition;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.context.annotation.Scope;
+
+@Configuration
+public class InitializerConfiguration {
+
+ @Bean
+ @Lazy
+ @Scope(BeanDefinition.SCOPE_PROTOTYPE)
+ public Color colorBean(ColorFactoryBean colorFactoryBean) {
+ return colorFactoryBean.getObject();
+ }
+}
diff --git a/src/main/java/com/epam/edu/spring/core/template/configuration/MainConfiguration.java b/src/main/java/com/epam/edu/spring/core/template/configuration/MainConfiguration.java
new file mode 100644
index 0000000..9547c75
--- /dev/null
+++ b/src/main/java/com/epam/edu/spring/core/template/configuration/MainConfiguration.java
@@ -0,0 +1,10 @@
+package com.epam.edu.spring.core.template.configuration;
+
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Import;
+
+@Configuration
+@ComponentScan(basePackages = {"com.epam.edu.spring.core.template"})
+@Import({RepositoryConfiguration.class, InitializerConfiguration.class})
+public class MainConfiguration {}
diff --git a/src/main/java/com/epam/edu/spring/core/template/configuration/MyConfiguration.java b/src/main/java/com/epam/edu/spring/core/template/configuration/MyConfiguration.java
deleted file mode 100644
index 12e5eab..0000000
--- a/src/main/java/com/epam/edu/spring/core/template/configuration/MyConfiguration.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.epam.edu.spring.core.template.configuration;
-
-//TODO add configuration
-public class MyConfiguration {
-}
diff --git a/src/main/java/com/epam/edu/spring/core/template/configuration/RepositoryConfiguration.java b/src/main/java/com/epam/edu/spring/core/template/configuration/RepositoryConfiguration.java
new file mode 100644
index 0000000..1ab6e5e
--- /dev/null
+++ b/src/main/java/com/epam/edu/spring/core/template/configuration/RepositoryConfiguration.java
@@ -0,0 +1,26 @@
+package com.epam.edu.spring.core.template.configuration;
+
+import com.epam.edu.spring.core.template.repository.ArrayListItemRepository;
+import com.epam.edu.spring.core.template.repository.ItemRepository;
+import com.epam.edu.spring.core.template.repository.LinkedListItemRepository;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.PropertySource;
+
+@Configuration
+@PropertySource("classpath:application.properties")
+public class RepositoryConfiguration {
+
+ @Bean
+ public ItemRepository itemRepository(
+ @Value("${item.repository.implementation}") String repository) {
+ ItemRepository itemRepository;
+ if ("link".equalsIgnoreCase(repository)) {
+ itemRepository = new LinkedListItemRepository();
+ } else {
+ itemRepository = new ArrayListItemRepository();
+ }
+ return itemRepository;
+ }
+}
diff --git a/src/main/java/com/epam/edu/spring/core/template/entity/Color.java b/src/main/java/com/epam/edu/spring/core/template/entity/Color.java
new file mode 100644
index 0000000..6d73f7e
--- /dev/null
+++ b/src/main/java/com/epam/edu/spring/core/template/entity/Color.java
@@ -0,0 +1,8 @@
+package com.epam.edu.spring.core.template.entity;
+
+public enum Color {
+ THIS_COLOR,
+ THAT_COLOR,
+ SOME_COLOR,
+ MORE_COLOR
+}
diff --git a/src/main/java/com/epam/edu/spring/core/template/entity/Item.java b/src/main/java/com/epam/edu/spring/core/template/entity/Item.java
new file mode 100644
index 0000000..79f2fe7
--- /dev/null
+++ b/src/main/java/com/epam/edu/spring/core/template/entity/Item.java
@@ -0,0 +1,62 @@
+package com.epam.edu.spring.core.template.entity;
+
+public class Item {
+ private long id;
+ private String name;
+ private double price;
+ private Color color;
+
+ public Item(long id, String name, double price, Color color) {
+ this.id = id;
+ this.name = name;
+ this.price = price;
+ this.color = color;
+ }
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public double getPrice() {
+ return price;
+ }
+
+ public void setPrice(double price) {
+ this.price = price;
+ }
+
+ public Color getColor() {
+ return color;
+ }
+
+ public void setColor(Color color) {
+ this.color = color;
+ }
+
+ @Override
+ public String toString() {
+ return "Item{"
+ + "id="
+ + id
+ + ", name='"
+ + name
+ + '\''
+ + ", price="
+ + price
+ + ", color="
+ + color
+ + '}';
+ }
+}
diff --git a/src/main/java/com/epam/edu/spring/core/template/factory/ColorFactoryBean.java b/src/main/java/com/epam/edu/spring/core/template/factory/ColorFactoryBean.java
new file mode 100644
index 0000000..012b1af
--- /dev/null
+++ b/src/main/java/com/epam/edu/spring/core/template/factory/ColorFactoryBean.java
@@ -0,0 +1,32 @@
+package com.epam.edu.spring.core.template.factory;
+
+import com.epam.edu.spring.core.template.entity.Color;
+import org.springframework.beans.factory.FactoryBean;
+import org.springframework.stereotype.Component;
+
+import java.util.Random;
+import java.util.stream.Stream;
+
+@Component
+public class ColorFactoryBean implements FactoryBean {
+
+ private final Random random = new Random();
+
+ @Override
+ public Color getObject() {
+ return Stream.of(Color.values())
+ .filter(color -> color.ordinal() == random.nextInt(Color.values().length))
+ .findAny()
+ .orElseThrow(IllegalStateException::new);
+ }
+
+ @Override
+ public Class> getObjectType() {
+ return Color.class;
+ }
+
+ @Override
+ public boolean isSingleton() {
+ return FactoryBean.super.isSingleton();
+ }
+}
diff --git a/src/main/java/com/epam/edu/spring/core/template/repository/AbstractRepository.java b/src/main/java/com/epam/edu/spring/core/template/repository/AbstractRepository.java
new file mode 100644
index 0000000..48e06e2
--- /dev/null
+++ b/src/main/java/com/epam/edu/spring/core/template/repository/AbstractRepository.java
@@ -0,0 +1,19 @@
+package com.epam.edu.spring.core.template.repository;
+
+import java.util.List;
+
+/**
+ * Абстрактный класс для хранения сущностей. ID сущности генерируется, исходя из initialSequence
+ *
+ * @param
+ */
+public abstract class AbstractRepository {
+
+ protected long initialSequence = 0;
+
+ protected List holder;
+
+ abstract void setInitialSequence(int val);
+
+ abstract void setHolder();
+}
diff --git a/src/main/java/com/epam/edu/spring/core/template/repository/ArrayListItemRepository.java b/src/main/java/com/epam/edu/spring/core/template/repository/ArrayListItemRepository.java
new file mode 100644
index 0000000..0a50fc5
--- /dev/null
+++ b/src/main/java/com/epam/edu/spring/core/template/repository/ArrayListItemRepository.java
@@ -0,0 +1,52 @@
+package com.epam.edu.spring.core.template.repository;
+
+import com.epam.edu.spring.core.template.entity.Item;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.PropertySource;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+/**
+ * Репозиторий, основанный на классе ArrayList. initialSequence должен браться из
+ * application.properties
+ */
+@Component
+@PropertySource("classpath:application.properties")
+public class ArrayListItemRepository extends AbstractRepository- implements ItemRepository {
+
+ private ArrayList
- holder;
+
+ @Value("${initial.sequence}")
+ int initialSequence;
+
+ @Override
+ public Item getById(long id) {
+ if (holder.stream().filter(item -> item.getId() == id).count() > 1) {
+ throw new IllegalStateException("More than 1 element found");
+ }
+ return holder.stream().filter(item -> item.getId() == id).collect(Collectors.toList()).get(0);
+ }
+
+ @Override
+ public boolean createItem(Item item) {
+ item.setId(initialSequence);
+ return holder.add(Objects.requireNonNull(item));
+ }
+
+ @Override
+ void setInitialSequence(int val) {
+ this.initialSequence += val;
+ }
+
+ public int getInitialSequence() {
+ return this.initialSequence;
+ }
+
+ @Override
+ void setHolder() {
+ this.holder = new ArrayList<>();
+ }
+}
diff --git a/src/main/java/com/epam/edu/spring/core/template/repository/ItemRepository.java b/src/main/java/com/epam/edu/spring/core/template/repository/ItemRepository.java
new file mode 100644
index 0000000..a8e4437
--- /dev/null
+++ b/src/main/java/com/epam/edu/spring/core/template/repository/ItemRepository.java
@@ -0,0 +1,10 @@
+package com.epam.edu.spring.core.template.repository;
+
+import com.epam.edu.spring.core.template.entity.Item;
+
+public interface ItemRepository {
+
+ Item getById(long id);
+
+ boolean createItem(Item item);
+}
diff --git a/src/main/java/com/epam/edu/spring/core/template/repository/LinkedListItemRepository.java b/src/main/java/com/epam/edu/spring/core/template/repository/LinkedListItemRepository.java
new file mode 100644
index 0000000..0eb8b73
--- /dev/null
+++ b/src/main/java/com/epam/edu/spring/core/template/repository/LinkedListItemRepository.java
@@ -0,0 +1,49 @@
+package com.epam.edu.spring.core.template.repository;
+
+import com.epam.edu.spring.core.template.entity.Item;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import java.util.LinkedList;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+/**
+ * Репозиторий, основанный на классе LinkedList. initialSequence должен случайно генерироваться из
+ * диапазона от 1 до 100
+ */
+@Component
+public class LinkedListItemRepository extends AbstractRepository
- implements ItemRepository {
+
+ private LinkedList
- holder;
+
+ @Value("#{T(java.lang.Math).random() * 100.0 }")
+ int initialSequence;
+
+ @Override
+ public Item getById(long id) {
+ if (holder.stream().filter(item -> item.getId() == id).count() > 1) {
+ throw new IllegalStateException("More than 1 element found");
+ }
+ return holder.stream().filter(item -> item.getId() == id).collect(Collectors.toList()).get(0);
+ }
+
+ @Override
+ public boolean createItem(Item item) {
+ return holder.add(Objects.requireNonNull(item));
+ }
+
+ @Override
+ void setInitialSequence(int val) {
+ this.initialSequence += val;
+ }
+
+ public int getInitialSequence() {
+ return this.initialSequence;
+ }
+
+ @Override
+ void setHolder() {
+ this.holder = new LinkedList<>();
+ }
+}
diff --git a/src/main/java/com/epam/edu/spring/core/template/repository/MyRepository.java b/src/main/java/com/epam/edu/spring/core/template/repository/MyRepository.java
deleted file mode 100644
index ab9bbaa..0000000
--- a/src/main/java/com/epam/edu/spring/core/template/repository/MyRepository.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.epam.edu.spring.core.template.repository;
-
-//TODO add logic for CRUD operations
-public class MyRepository {
-}
diff --git a/src/main/java/com/epam/edu/spring/core/template/service/ItemService.java b/src/main/java/com/epam/edu/spring/core/template/service/ItemService.java
new file mode 100644
index 0000000..7c5af6d
--- /dev/null
+++ b/src/main/java/com/epam/edu/spring/core/template/service/ItemService.java
@@ -0,0 +1,10 @@
+package com.epam.edu.spring.core.template.service;
+
+import com.epam.edu.spring.core.template.entity.Item;
+
+public interface ItemService {
+
+ Item getById(long id);
+
+ boolean createItem(Item item);
+}
diff --git a/src/main/java/com/epam/edu/spring/core/template/service/MyService.java b/src/main/java/com/epam/edu/spring/core/template/service/MyService.java
deleted file mode 100644
index 4254f76..0000000
--- a/src/main/java/com/epam/edu/spring/core/template/service/MyService.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.epam.edu.spring.core.template.service;
-
-//TODO add logic for access to business objects
-public class MyService {
-}
diff --git a/src/main/java/com/epam/edu/spring/core/template/service/SimpleItemService.java b/src/main/java/com/epam/edu/spring/core/template/service/SimpleItemService.java
new file mode 100644
index 0000000..24438e0
--- /dev/null
+++ b/src/main/java/com/epam/edu/spring/core/template/service/SimpleItemService.java
@@ -0,0 +1,39 @@
+package com.epam.edu.spring.core.template.service;
+
+import com.epam.edu.spring.core.template.entity.Item;
+import com.epam.edu.spring.core.template.repository.ItemRepository;
+import com.epam.edu.spring.core.template.validator.ItemValidator;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class SimpleItemService implements ItemService {
+
+ private ItemRepository itemRepository;
+ private ItemValidator itemValidator;
+
+ @Autowired
+ public SimpleItemService(ItemRepository itemRepository, ItemValidator itemValidator) {
+ this.itemRepository = itemRepository;
+ this.itemValidator = itemValidator;
+ }
+
+ @Override
+ public Item getById(long id) {
+ return null;
+ }
+
+ @Override
+ public boolean createItem(Item item) {
+ return false;
+ }
+
+ public void setItemRepository(ItemRepository itemRepository) {
+ this.itemRepository = itemRepository;
+ }
+
+ public void setItemRepository(ItemValidator itemValidator) {
+ this.itemValidator = itemValidator;
+ }
+
+}
diff --git a/src/main/java/com/epam/edu/spring/core/template/validation/MyValidator.java b/src/main/java/com/epam/edu/spring/core/template/validation/MyValidator.java
deleted file mode 100644
index 676bb35..0000000
--- a/src/main/java/com/epam/edu/spring/core/template/validation/MyValidator.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.epam.edu.spring.core.template.validation;
-
-//TODO add logic for validation
-public class MyValidator {
-}
diff --git a/src/main/java/com/epam/edu/spring/core/template/validator/ItemValidator.java b/src/main/java/com/epam/edu/spring/core/template/validator/ItemValidator.java
new file mode 100644
index 0000000..55cda3e
--- /dev/null
+++ b/src/main/java/com/epam/edu/spring/core/template/validator/ItemValidator.java
@@ -0,0 +1,8 @@
+package com.epam.edu.spring.core.template.validator;
+
+import com.epam.edu.spring.core.template.entity.Item;
+
+public interface ItemValidator {
+
+ boolean isItemValid(Item item);
+}
diff --git a/src/main/java/com/epam/edu/spring/core/template/validator/SimpleItemValidator.java b/src/main/java/com/epam/edu/spring/core/template/validator/SimpleItemValidator.java
new file mode 100644
index 0000000..4f08ebe
--- /dev/null
+++ b/src/main/java/com/epam/edu/spring/core/template/validator/SimpleItemValidator.java
@@ -0,0 +1,13 @@
+package com.epam.edu.spring.core.template.validator;
+
+import com.epam.edu.spring.core.template.entity.Item;
+import org.springframework.stereotype.Component;
+
+@Component
+public class SimpleItemValidator implements ItemValidator {
+
+ @Override
+ public boolean isItemValid(Item item) {
+ return item != null && item.getId() >= 0 && item.getName() != null && item.getPrice() > 0;
+ }
+}
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index 8b13789..27d53ac 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -1 +1,2 @@
-
+initial.sequence=42
+item.repository.implementation=link
\ No newline at end of file
diff --git a/src/test/java/com/epam/edu/spring/core/template/SpringCoreTemplateTest.java b/src/test/java/com/epam/edu/spring/core/template/SpringCoreTemplateTest.java
new file mode 100644
index 0000000..fdb5d72
--- /dev/null
+++ b/src/test/java/com/epam/edu/spring/core/template/SpringCoreTemplateTest.java
@@ -0,0 +1,93 @@
+package com.epam.edu.spring.core.template;
+
+import com.epam.edu.spring.core.template.configuration.MainConfiguration;
+import com.epam.edu.spring.core.template.entity.Color;
+import com.epam.edu.spring.core.template.repository.ArrayListItemRepository;
+import com.epam.edu.spring.core.template.repository.LinkedListItemRepository;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.Arguments;
+import org.junit.jupiter.params.provider.MethodSource;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.annotation.AnnotationConfigApplicationContext;
+import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
+import org.springframework.util.ClassUtils;
+
+import java.util.Arrays;
+import java.util.Objects;
+import java.util.function.Predicate;
+import java.util.stream.Stream;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+@SpringJUnitConfig(classes = {MainConfiguration.class})
+@DisplayName("Spring beans tests")
+class SpringCoreTemplateTest {
+
+ @Autowired
+ private final ApplicationContext context =
+ new AnnotationConfigApplicationContext(MainConfiguration.class);
+
+ @DisplayName("Test beans exists")
+ @ParameterizedTest
+ @MethodSource("getBeansWithClasses")
+ void testCorrectBeansInstance(String beanName, String clazz) {
+ assertTrue(isCorrectBean(context.getBean(beanName), clazz));
+ }
+
+ @Test
+ @DisplayName("Test array list initial sequence value")
+ void testInitialSequenceArrayList(@Value("${initial.sequence}") int propertyValue) {
+ ArrayListItemRepository arrayListItemRepository =
+ context.getBean("arrayListItemRepository", ArrayListItemRepository.class);
+ assertEquals(propertyValue, arrayListItemRepository.getInitialSequence());
+ }
+
+ @Test
+ @DisplayName("Test linked list initial sequence value")
+ void testRandomInitialSequenceLinkedList() {
+ LinkedListItemRepository linkedListItemRepository =
+ context.getBean("linkedListItemRepository", LinkedListItemRepository.class);
+ int initialSequence = linkedListItemRepository.getInitialSequence();
+ assertTrue(initialSequence >= 0 && initialSequence < 100);
+ }
+
+ @Test
+ @DisplayName("Test Color Bean")
+ void testColorFactoryBean() {
+ Color color = context.getBean("colorFactoryBean", Color.class);
+ boolean colorCheck = false;
+ colorCheck = Arrays.stream(Color.values()).anyMatch(Predicate.isEqual(color));
+ assertTrue(colorCheck);
+ }
+
+ @Test
+ @DisplayName("Test item repository type")
+ void testItemRepositoryType(
+ @Value("${item.repository.implementation=link}") String itemRepositoryProperty) {
+ Object itemRepository = context.getBean("itemRepository");
+ if ("link".equalsIgnoreCase(itemRepositoryProperty)) {
+ assertTrue(isCorrectBean(itemRepository, "LinkedListItemRepository"));
+ } else {
+ assertTrue(isCorrectBean(itemRepository, "ArrayListItemRepository"));
+ }
+ }
+
+ private boolean isCorrectBean(Object bean, String clazz) {
+ return Objects.nonNull(bean) && ClassUtils.getUserClass(bean).getSimpleName().equals(clazz);
+ }
+
+ private static Stream getBeansWithClasses() {
+ return Stream.of(
+ Arguments.of("mainConfiguration", "MainConfiguration"),
+ Arguments.of("initializerConfiguration", "InitializerConfiguration"),
+ Arguments.of("repositoryConfiguration", "RepositoryConfiguration"),
+ Arguments.of("arrayListItemRepository", "ArrayListItemRepository"),
+ Arguments.of("linkedListItemRepository", "LinkedListItemRepository"),
+ Arguments.of("simpleItemService", "SimpleItemService"),
+ Arguments.of("simpleItemValidator", "SimpleItemValidator"));
+ }
+}
diff --git a/src/test/java/com/epam/edu/spring/core/template/SpringEducationSkeletonApplicationTests.java b/src/test/java/com/epam/edu/spring/core/template/SpringEducationSkeletonApplicationTests.java
deleted file mode 100644
index 128e270..0000000
--- a/src/test/java/com/epam/edu/spring/core/template/SpringEducationSkeletonApplicationTests.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.epam.edu.spring.core.template;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.test.context.junit4.SpringRunner;
-
-@RunWith(SpringRunner.class)
-@SpringBootTest
-public class SpringEducationSkeletonApplicationTests {
-
- @Test
- public void contextLoads() {
- }
-
-}