spring-boot-2-template
196 строк · 7.3 Кб
1package by.andd3dfx.templateapp.services.impl;
2
3import by.andd3dfx.templateapp.dto.ArticleDto;
4import by.andd3dfx.templateapp.dto.ArticleUpdateDto;
5import by.andd3dfx.templateapp.error.exception.ArticleNotFoundException;
6import by.andd3dfx.templateapp.mappers.ArticleMapper;
7import by.andd3dfx.templateapp.persistence.dao.ArticleRepository;
8import by.andd3dfx.templateapp.persistence.entities.Article;
9import org.junit.jupiter.api.BeforeEach;
10import org.junit.jupiter.api.Test;
11import org.junit.jupiter.api.extension.ExtendWith;
12import org.mockito.InjectMocks;
13import org.mockito.Mock;
14import org.mockito.junit.jupiter.MockitoExtension;
15import org.springframework.data.domain.PageImpl;
16import org.springframework.data.domain.PageRequest;
17import org.springframework.data.domain.Pageable;
18import org.springframework.data.domain.Slice;
19import org.springframework.data.domain.Sort;
20
21import java.time.Clock;
22import java.time.Instant;
23import java.time.ZoneId;
24import java.util.Arrays;
25import java.util.List;
26import java.util.Optional;
27
28import static org.hamcrest.CoreMatchers.is;
29import static org.hamcrest.MatcherAssert.assertThat;
30import static org.junit.jupiter.api.Assertions.fail;
31import static org.mockito.Mockito.doReturn;
32import static org.mockito.Mockito.lenient;
33import static org.mockito.Mockito.verify;
34import static org.mockito.Mockito.when;
35
36@ExtendWith(MockitoExtension.class)
37class ArticleServiceTest {
38
39@Mock
40private ArticleRepository articleRepositoryMock;
41
42@Mock
43private ArticleMapper articleMapperMock;
44
45@Mock
46private Clock clockMock;
47private Clock fixedClock;
48
49@InjectMocks
50private ArticleService articleService;
51
52@BeforeEach
53public void before() {
54fixedClock = Clock.fixed(Instant.parse("2014-12-22T10:15:30.00Z"), ZoneId.systemDefault());
55// Allow unnecessary stubbing:
56lenient().doReturn(fixedClock.instant()).when(clockMock).instant();
57lenient().doReturn(fixedClock.getZone()).when(clockMock).getZone();
58}
59
60@Test
61void create() {
62ArticleDto articleDto = ArticleDto.builder().build();
63Article article = Article.builder().build();
64Article updatedArticle = Article.builder().build();
65ArticleDto updatedArticleDto = ArticleDto.builder().build();
66
67when(articleMapperMock.toArticle(articleDto)).thenReturn(article);
68when(articleRepositoryMock.save(article)).thenReturn(updatedArticle);
69when(articleMapperMock.toArticleDto(updatedArticle)).thenReturn(updatedArticleDto);
70
71ArticleDto result = articleService.create(articleDto);
72
73verify(articleMapperMock).toArticle(articleDto);
74verify(articleRepositoryMock).save(article);
75verify(articleMapperMock).toArticleDto(updatedArticle);
76assertThat(result, is(updatedArticleDto));
77}
78
79@Test
80public void get() {
81final Long ARTICLE_ID = 123L;
82Article article = new Article();
83Optional<Article> optionalArticle = Optional.of(article);
84ArticleDto articleDto = new ArticleDto();
85when(articleRepositoryMock.findById(ARTICLE_ID)).thenReturn(optionalArticle);
86when(articleMapperMock.toArticleDto(article)).thenReturn(articleDto);
87
88ArticleDto result = articleService.get(ARTICLE_ID);
89
90verify(articleRepositoryMock).findById(ARTICLE_ID);
91verify(articleMapperMock).toArticleDto(article);
92assertThat(result, is(articleDto));
93}
94
95@Test
96public void getAbsentArticle() {
97final Long ARTICLE_ID = 123L;
98Optional<Article> optionalArticle = Optional.empty();
99when(articleRepositoryMock.findById(ARTICLE_ID)).thenReturn(optionalArticle);
100
101try {
102articleService.get(ARTICLE_ID);
103
104fail("Exception should be thrown");
105} catch (ArticleNotFoundException ex) {
106verify(articleRepositoryMock).findById(ARTICLE_ID);
107}
108}
109
110@Test
111void update() {
112final Long ARTICLE_ID = 123L;
113Article article = new Article();
114Article savedArticle = new Article();
115Optional<Article> optionalArticle = Optional.of(article);
116ArticleUpdateDto articleUpdateDto = new ArticleUpdateDto();
117ArticleDto updatedArticleDto = ArticleDto.builder()
118.title("New title")
119.build();
120
121when(articleRepositoryMock.findById(ARTICLE_ID)).thenReturn(optionalArticle);
122when(articleRepositoryMock.save(article)).thenReturn(savedArticle);
123when(articleMapperMock.toArticleDto(savedArticle)).thenReturn(updatedArticleDto);
124
125articleService.update(ARTICLE_ID, articleUpdateDto);
126
127verify(articleRepositoryMock).findById(ARTICLE_ID);
128verify(articleMapperMock).toArticle(articleUpdateDto, article);
129verify(articleRepositoryMock).save(article);
130verify(articleMapperMock).toArticleDto(savedArticle);
131}
132
133@Test
134void updateAbsentArticle() {
135final Long ARTICLE_ID = 123L;
136Optional<Article> optionalArticle = Optional.empty();
137when(articleRepositoryMock.findById(ARTICLE_ID)).thenReturn(optionalArticle);
138ArticleUpdateDto articleUpdateDto = new ArticleUpdateDto();
139
140try {
141articleService.update(ARTICLE_ID, articleUpdateDto);
142
143fail("Exception should be thrown");
144} catch (ArticleNotFoundException ex) {
145verify(articleRepositoryMock).findById(ARTICLE_ID);
146}
147}
148
149@Test
150void delete() {
151final Long ARTICLE_ID = 123L;
152when(articleRepositoryMock.existsById(ARTICLE_ID)).thenReturn(true);
153
154articleService.delete(ARTICLE_ID);
155
156verify(articleRepositoryMock).existsById(ARTICLE_ID);
157verify(articleRepositoryMock).deleteById(ARTICLE_ID);
158}
159
160@Test
161void deleteAbsentArticle() {
162final Long ARTICLE_ID = 123L;
163when(articleRepositoryMock.existsById(ARTICLE_ID)).thenReturn(false);
164
165try {
166articleService.delete(ARTICLE_ID);
167
168fail("Exception should be thrown");
169} catch (ArticleNotFoundException ex) {
170verify(articleRepositoryMock).existsById(ARTICLE_ID);
171assertThat("Wrong message", ex.getMessage(), is("Could not find an article by id=" + ARTICLE_ID));
172}
173}
174
175@Test
176void getAllPaged() {
177final Integer pageNo = 2;
178final Integer pageSize = 20;
179final String sortBy = "title";
180final Pageable pageRequest = PageRequest.of(pageNo, pageSize, Sort.by(sortBy));
181
182final List<Article> articles = Arrays.asList(new Article());
183final Slice<Article> pagedResult = new PageImpl<>(articles, pageRequest, articles.size());
184final List<ArticleDto> articleDtoList = Arrays.asList(new ArticleDto());
185
186doReturn(pagedResult).when(articleRepositoryMock).findAll(pageRequest);
187doReturn(articleDtoList.get(0)).when(articleMapperMock).toArticleDto(articles.get(0));
188
189Slice<ArticleDto> result = articleService.getAll(pageRequest);
190
191verify(articleRepositoryMock).findAll(pageRequest);
192verify(articleMapperMock).toArticleDto(articles.get(0));
193assertThat(result.getContent().size(), is(1));
194assertThat(result.getContent().get(0), is(articleDtoList.get(0)));
195}
196}
197