From 5ca6878fad287e5c0a1c4678bb756522670aa3f7 Mon Sep 17 00:00:00 2001 From: MangKyu Date: Mon, 10 Jan 2022 21:31:27 +0900 Subject: [PATCH 1/3] Modify NoArgsConstructor access level to private --- .../interview/app/answer/constants/AnswerConstants.java | 3 ++- .../employment/interview/app/file/constants/FileConstants.java | 3 ++- .../employment/interview/app/quiz/constants/QuizConstants.java | 3 ++- .../interview/app/quiz/converter/QuizDtoConverter.java | 3 ++- .../java/com/mangkyu/employment/interview/utils/DateUtils.java | 3 ++- .../java/com/mangkyu/employment/interview/utils/FileUtils.java | 3 ++- 6 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/mangkyu/employment/interview/app/answer/constants/AnswerConstants.java b/src/main/java/com/mangkyu/employment/interview/app/answer/constants/AnswerConstants.java index 8b100eb..9c5443a 100644 --- a/src/main/java/com/mangkyu/employment/interview/app/answer/constants/AnswerConstants.java +++ b/src/main/java/com/mangkyu/employment/interview/app/answer/constants/AnswerConstants.java @@ -1,8 +1,9 @@ package com.mangkyu.employment.interview.app.answer.constants; +import lombok.AccessLevel; import lombok.NoArgsConstructor; -@NoArgsConstructor +@NoArgsConstructor(access = AccessLevel.PRIVATE) public final class AnswerConstants { public static final int MAX_ANSWER_SIZE = 5000; diff --git a/src/main/java/com/mangkyu/employment/interview/app/file/constants/FileConstants.java b/src/main/java/com/mangkyu/employment/interview/app/file/constants/FileConstants.java index 1a73247..0a6e114 100644 --- a/src/main/java/com/mangkyu/employment/interview/app/file/constants/FileConstants.java +++ b/src/main/java/com/mangkyu/employment/interview/app/file/constants/FileConstants.java @@ -1,8 +1,9 @@ package com.mangkyu.employment.interview.app.file.constants; +import lombok.AccessLevel; import lombok.NoArgsConstructor; -@NoArgsConstructor +@NoArgsConstructor(access = AccessLevel.PRIVATE) public final class FileConstants { public static final String FILE_API_PREFIX = "/file"; diff --git a/src/main/java/com/mangkyu/employment/interview/app/quiz/constants/QuizConstants.java b/src/main/java/com/mangkyu/employment/interview/app/quiz/constants/QuizConstants.java index c3d4b6c..217e199 100644 --- a/src/main/java/com/mangkyu/employment/interview/app/quiz/constants/QuizConstants.java +++ b/src/main/java/com/mangkyu/employment/interview/app/quiz/constants/QuizConstants.java @@ -1,8 +1,9 @@ package com.mangkyu.employment.interview.app.quiz.constants; +import lombok.AccessLevel; import lombok.NoArgsConstructor; -@NoArgsConstructor +@NoArgsConstructor(access = AccessLevel.PRIVATE) public final class QuizConstants { public static final int DEFAULT_QUIZ_SIZE = 3; diff --git a/src/main/java/com/mangkyu/employment/interview/app/quiz/converter/QuizDtoConverter.java b/src/main/java/com/mangkyu/employment/interview/app/quiz/converter/QuizDtoConverter.java index 0103489..eb2092c 100644 --- a/src/main/java/com/mangkyu/employment/interview/app/quiz/converter/QuizDtoConverter.java +++ b/src/main/java/com/mangkyu/employment/interview/app/quiz/converter/QuizDtoConverter.java @@ -7,6 +7,7 @@ import com.mangkyu.employment.interview.app.quiz.dto.GetQuizResponse; import com.mangkyu.employment.interview.app.quiz.entity.Quiz; import com.mangkyu.employment.interview.enums.common.EnumMapperValue; import com.mangkyu.employment.interview.enums.value.QuizLevel; +import lombok.AccessLevel; import lombok.NoArgsConstructor; import org.apache.commons.lang3.StringUtils; @@ -14,7 +15,7 @@ import java.sql.Timestamp; import java.util.List; import java.util.stream.Collectors; -@NoArgsConstructor +@NoArgsConstructor(access = AccessLevel.PRIVATE) public final class QuizDtoConverter { public static GetAnswerResponse convert(final Answer answer) { diff --git a/src/main/java/com/mangkyu/employment/interview/utils/DateUtils.java b/src/main/java/com/mangkyu/employment/interview/utils/DateUtils.java index 383703d..c4083db 100644 --- a/src/main/java/com/mangkyu/employment/interview/utils/DateUtils.java +++ b/src/main/java/com/mangkyu/employment/interview/utils/DateUtils.java @@ -1,11 +1,12 @@ package com.mangkyu.employment.interview.utils; +import lombok.AccessLevel; import lombok.NoArgsConstructor; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; -@NoArgsConstructor +@NoArgsConstructor(access = AccessLevel.PRIVATE) public final class DateUtils { public static String getCurrentDate() { diff --git a/src/main/java/com/mangkyu/employment/interview/utils/FileUtils.java b/src/main/java/com/mangkyu/employment/interview/utils/FileUtils.java index aa6dc62..d348a14 100644 --- a/src/main/java/com/mangkyu/employment/interview/utils/FileUtils.java +++ b/src/main/java/com/mangkyu/employment/interview/utils/FileUtils.java @@ -1,5 +1,6 @@ package com.mangkyu.employment.interview.utils; +import lombok.AccessLevel; import lombok.NoArgsConstructor; import org.springframework.util.FileCopyUtils; import org.springframework.util.ResourceUtils; @@ -10,7 +11,7 @@ import java.io.IOException; import java.io.InputStream; import java.nio.charset.StandardCharsets; -@NoArgsConstructor +@NoArgsConstructor(access = AccessLevel.PRIVATE) public final class FileUtils { public static String readFileText(final String filePath) throws IOException { From 2ae1a46401f6671e6c671f26f617f0260f7a2063 Mon Sep 17 00:00:00 2001 From: MangKyu Date: Mon, 10 Jan 2022 23:23:28 +0900 Subject: [PATCH 2/3] Modify ControllerTestCode as WebMvcTest --- .../controller/AnswerControllerTest.java | 24 +++++------------ .../enums/controller/EnumsControllerTest.java | 26 +++++++------------ .../file/controller/FileControllerTest.java | 19 ++++++-------- .../quiz/controller/QuizControllerTest.java | 24 +++++------------ .../user/controller/UserControllerTest.java | 22 +++++----------- 5 files changed, 37 insertions(+), 78 deletions(-) diff --git a/src/test/java/com/mangkyu/employment/interview/app/answer/controller/AnswerControllerTest.java b/src/test/java/com/mangkyu/employment/interview/app/answer/controller/AnswerControllerTest.java index 2e33071..daaf1ed 100644 --- a/src/test/java/com/mangkyu/employment/interview/app/answer/controller/AnswerControllerTest.java +++ b/src/test/java/com/mangkyu/employment/interview/app/answer/controller/AnswerControllerTest.java @@ -4,20 +4,17 @@ import com.google.gson.Gson; import com.mangkyu.employment.interview.app.answer.dto.AddAnswerRequest; import com.mangkyu.employment.interview.app.answer.dto.GetAnswerResponse; import com.mangkyu.employment.interview.app.answer.service.AnswerService; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.http.MediaType; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.ResultActions; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; import java.nio.charset.StandardCharsets; import java.util.UUID; @@ -27,21 +24,14 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.doReturn; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -@ExtendWith(MockitoExtension.class) +@WebMvcTest(AnswerController.class) class AnswerControllerTest { - @InjectMocks - private AnswerController target; - - @Mock - private AnswerService answerService; - + @Autowired private MockMvc mockMvc; - @BeforeEach - public void init() { - mockMvc = MockMvcBuilders.standaloneSetup(target).build(); - } + @MockBean + private AnswerService answerService; @Test public void getAnswer() throws Exception { diff --git a/src/test/java/com/mangkyu/employment/interview/app/enums/controller/EnumsControllerTest.java b/src/test/java/com/mangkyu/employment/interview/app/enums/controller/EnumsControllerTest.java index 9a752ab..98e6398 100644 --- a/src/test/java/com/mangkyu/employment/interview/app/enums/controller/EnumsControllerTest.java +++ b/src/test/java/com/mangkyu/employment/interview/app/enums/controller/EnumsControllerTest.java @@ -6,38 +6,30 @@ import com.mangkyu.employment.interview.enums.factory.EnumMapperFactory; import com.mangkyu.employment.interview.enums.value.QuizCategory; import com.mangkyu.employment.interview.enums.value.QuizDay; import com.mangkyu.employment.interview.enums.value.QuizLevel; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.InjectMocks; -import org.mockito.Spy; -import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.SpyBean; +import org.springframework.context.annotation.Import; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.ResultActions; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -@ExtendWith(MockitoExtension.class) +@WebMvcTest(EnumsController.class) +@Import(EnumMapperConfig.class) class EnumsControllerTest { - @InjectMocks - private EnumsController target; - - @Spy - private EnumMapperFactory enumMapperFactory = new EnumMapperConfig().enumMapperFactory(); + @SpyBean + private EnumMapperFactory enumMapperFactory; + @Autowired private MockMvc mockMvc; - @BeforeEach - public void init() { - mockMvc = MockMvcBuilders.standaloneSetup(target).build(); - } - @Test public void getEnumsQuizCategoryList() throws Exception { // given diff --git a/src/test/java/com/mangkyu/employment/interview/app/file/controller/FileControllerTest.java b/src/test/java/com/mangkyu/employment/interview/app/file/controller/FileControllerTest.java index fe2b3de..7c1819e 100644 --- a/src/test/java/com/mangkyu/employment/interview/app/file/controller/FileControllerTest.java +++ b/src/test/java/com/mangkyu/employment/interview/app/file/controller/FileControllerTest.java @@ -1,6 +1,7 @@ package com.mangkyu.employment.interview.app.file.controller; import com.google.gson.Gson; +import com.mangkyu.employment.interview.app.enums.controller.EnumsController; import com.mangkyu.employment.interview.app.file.dto.FileUploadResponse; import com.mangkyu.employment.interview.app.file.service.FileService; import org.junit.jupiter.api.BeforeEach; @@ -9,6 +10,9 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.core.io.ByteArrayResource; import org.springframework.core.io.Resource; import org.springframework.mock.web.MockMultipartFile; @@ -25,21 +29,14 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.doReturn; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -@ExtendWith(MockitoExtension.class) +@WebMvcTest(FileController.class) class FileControllerTest { - @InjectMocks - private FileController target; - - @Mock - private FileService fileService; - + @Autowired private MockMvc mockMvc; - @BeforeEach - public void init() { - mockMvc = MockMvcBuilders.standaloneSetup(target).build(); - } + @MockBean + private FileService fileService; @Test public void uploadFileSuccess() throws Exception { diff --git a/src/test/java/com/mangkyu/employment/interview/app/quiz/controller/QuizControllerTest.java b/src/test/java/com/mangkyu/employment/interview/app/quiz/controller/QuizControllerTest.java index 7ab7a7c..5deb38a 100644 --- a/src/test/java/com/mangkyu/employment/interview/app/quiz/controller/QuizControllerTest.java +++ b/src/test/java/com/mangkyu/employment/interview/app/quiz/controller/QuizControllerTest.java @@ -9,15 +9,13 @@ import com.mangkyu.employment.interview.enums.common.EnumMapperType; import com.mangkyu.employment.interview.enums.common.EnumMapperValue; import com.mangkyu.employment.interview.enums.value.QuizCategory; import com.mangkyu.employment.interview.enums.value.QuizLevel; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; @@ -25,7 +23,6 @@ import org.springframework.http.MediaType; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.ResultActions; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; import java.util.Arrays; import java.util.Collections; @@ -37,21 +34,14 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doReturn; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -@ExtendWith(MockitoExtension.class) +@WebMvcTest(QuizController.class) class QuizControllerTest { - @InjectMocks - private QuizController target; - - @Mock - private QuizService quizService; - + @Autowired private MockMvc mockMvc; - @BeforeEach - public void init() { - mockMvc = MockMvcBuilders.standaloneSetup(target).build(); - } + @MockBean + private QuizService quizService; @Test public void getQuiz() throws Exception { diff --git a/src/test/java/com/mangkyu/employment/interview/app/user/controller/UserControllerTest.java b/src/test/java/com/mangkyu/employment/interview/app/user/controller/UserControllerTest.java index 4cbdaba..8130af6 100644 --- a/src/test/java/com/mangkyu/employment/interview/app/user/controller/UserControllerTest.java +++ b/src/test/java/com/mangkyu/employment/interview/app/user/controller/UserControllerTest.java @@ -6,39 +6,29 @@ import com.mangkyu.employment.interview.app.user.service.UserService; import com.mangkyu.employment.interview.enums.value.QuizCategory; import com.mangkyu.employment.interview.enums.value.QuizDay; import com.mangkyu.employment.interview.enums.value.QuizLevel; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.http.MediaType; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.ResultActions; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; import java.util.HashSet; import java.util.Set; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -@ExtendWith(MockitoExtension.class) +@WebMvcTest(UserController.class) class UserControllerTest { - @InjectMocks - private UserController target; - - @Mock + @MockBean private UserService userService; + @Autowired private MockMvc mockMvc; - @BeforeEach - public void init() { - mockMvc = MockMvcBuilders.standaloneSetup(target).build(); - } - @Test public void addUserFail_EmailIsEmpty() throws Exception { // given From 993b38dd1f829f8b3d896b0cd2f5d1ebeb5899d3 Mon Sep 17 00:00:00 2001 From: MangKyu Date: Tue, 1 Feb 2022 02:42:32 +0900 Subject: [PATCH 3/3] Filter searchQuiz which has answer only --- .../quiz/repository/QuizRepositoryImpl.java | 2 ++ .../quiz/repository/QuizRepositoryTest.java | 29 ++++++++++++++----- 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/mangkyu/employment/interview/app/quiz/repository/QuizRepositoryImpl.java b/src/main/java/com/mangkyu/employment/interview/app/quiz/repository/QuizRepositoryImpl.java index ec397f1..50d56d5 100644 --- a/src/main/java/com/mangkyu/employment/interview/app/quiz/repository/QuizRepositoryImpl.java +++ b/src/main/java/com/mangkyu/employment/interview/app/quiz/repository/QuizRepositoryImpl.java @@ -35,12 +35,14 @@ public class QuizRepositoryImpl implements QuizRepositoryCustom { .where(quizLevelsIn(qQuiz, condition.getLevels())) .offset(pageable.getOffset()) .limit(pageable.getPageSize()) + .where(qQuiz.answer.isNotNull()) .fetch(); final long count = query.selectFrom(qQuiz) .where(titleLike(qQuiz, condition.getQuery())) .where(quizCategoriesIn(qQuiz, condition.getCategories())) .where(quizLevelsIn(qQuiz, condition.getLevels())) + .where(qQuiz.answer.isNotNull()) .stream().count(); return new PageImpl<>(quizList, pageable, count); diff --git a/src/test/java/com/mangkyu/employment/interview/app/quiz/repository/QuizRepositoryTest.java b/src/test/java/com/mangkyu/employment/interview/app/quiz/repository/QuizRepositoryTest.java index 10bc3e5..605cecf 100644 --- a/src/test/java/com/mangkyu/employment/interview/app/quiz/repository/QuizRepositoryTest.java +++ b/src/test/java/com/mangkyu/employment/interview/app/quiz/repository/QuizRepositoryTest.java @@ -1,6 +1,8 @@ package com.mangkyu.employment.interview.app.quiz.repository; import com.mangkyu.employment.interview.JpaTestConfig; +import com.mangkyu.employment.interview.app.answer.entity.Answer; +import com.mangkyu.employment.interview.app.answer.repository.AnswerRepository; import com.mangkyu.employment.interview.app.quiz.dto.QuizSearchCondition; import com.mangkyu.employment.interview.app.quiz.entity.Quiz; import com.mangkyu.employment.interview.enums.value.QuizCategory; @@ -25,6 +27,8 @@ class QuizRepositoryTest { @Autowired private QuizRepository quizRepository; + @Autowired + private AnswerRepository answerRepository; @ParameterizedTest @MethodSource("validQuizParameters") @@ -321,14 +325,23 @@ class QuizRepositoryTest { } private void initForPaging(final QuizCategory quizCategory) { - quizRepository.save(EntityCreationUtils.quiz("quiz", quizCategory, Arrays.asList(QuizLevel.JUNIOR, QuizLevel.SENIOR))); - quizRepository.save(EntityCreationUtils.quiz("quiz", quizCategory, Arrays.asList(QuizLevel.JUNIOR, QuizLevel.SENIOR))); - quizRepository.save(EntityCreationUtils.quiz("quiz", quizCategory, Arrays.asList(QuizLevel.JUNIOR, QuizLevel.SENIOR))); - quizRepository.save(EntityCreationUtils.quiz("quiz", quizCategory, Arrays.asList(QuizLevel.JUNIOR, QuizLevel.SENIOR))); - quizRepository.save(EntityCreationUtils.quiz("quiz", quizCategory, Arrays.asList(QuizLevel.JUNIOR, QuizLevel.SENIOR))); - quizRepository.save(EntityCreationUtils.quiz("quiz", quizCategory, Arrays.asList(QuizLevel.JUNIOR, QuizLevel.SENIOR))); - quizRepository.save(EntityCreationUtils.quiz("quiz", QuizCategory.ALGORITHM, Collections.singletonList(QuizLevel.SENIOR))); - quizRepository.save(EntityCreationUtils.quiz("quiz", QuizCategory.DATABASE, Collections.singletonList(QuizLevel.SENIOR))); + final Quiz savedQuiz1 = quizRepository.save(EntityCreationUtils.quiz("quiz", quizCategory, Arrays.asList(QuizLevel.JUNIOR, QuizLevel.SENIOR))); + final Quiz savedQuiz2 = quizRepository.save(EntityCreationUtils.quiz("quiz", quizCategory, Arrays.asList(QuizLevel.JUNIOR, QuizLevel.SENIOR))); + final Quiz savedQuiz3 = quizRepository.save(EntityCreationUtils.quiz("quiz", quizCategory, Arrays.asList(QuizLevel.JUNIOR, QuizLevel.SENIOR))); + final Quiz savedQuiz4 = quizRepository.save(EntityCreationUtils.quiz("quiz", quizCategory, Arrays.asList(QuizLevel.JUNIOR, QuizLevel.SENIOR))); + final Quiz savedQuiz5 = quizRepository.save(EntityCreationUtils.quiz("quiz", quizCategory, Arrays.asList(QuizLevel.JUNIOR, QuizLevel.SENIOR))); + final Quiz savedQuiz6 = quizRepository.save(EntityCreationUtils.quiz("quiz", quizCategory, Arrays.asList(QuizLevel.JUNIOR, QuizLevel.SENIOR))); + final Quiz savedQuiz7 = quizRepository.save(EntityCreationUtils.quiz("quiz", QuizCategory.ALGORITHM, Collections.singletonList(QuizLevel.SENIOR))); + final Quiz savedQuiz8 = quizRepository.save(EntityCreationUtils.quiz("quiz", QuizCategory.DATABASE, Collections.singletonList(QuizLevel.SENIOR))); + + savedQuiz1.setAnswer(answerRepository.save(EntityCreationUtils.answer(savedQuiz1))); + savedQuiz2.setAnswer(answerRepository.save(EntityCreationUtils.answer(savedQuiz2))); + savedQuiz3.setAnswer(answerRepository.save(EntityCreationUtils.answer(savedQuiz3))); + savedQuiz4.setAnswer(answerRepository.save(EntityCreationUtils.answer(savedQuiz4))); + savedQuiz5.setAnswer(answerRepository.save(EntityCreationUtils.answer(savedQuiz5))); + savedQuiz6.setAnswer(answerRepository.save(EntityCreationUtils.answer(savedQuiz6))); + savedQuiz7.setAnswer(answerRepository.save(EntityCreationUtils.answer(savedQuiz7))); + savedQuiz8.setAnswer(answerRepository.save(EntityCreationUtils.answer(savedQuiz8))); } private static Stream validQuizParameters() {