From 6df8cd3fcf21f1f8da3fc976145236e2960c2ab0 Mon Sep 17 00:00:00 2001 From: Rebwon Date: Thu, 28 Oct 2021 11:25:19 +0900 Subject: [PATCH] Using Spring Text Context Caching --- src/test/java/com/yam/app/ArchUnitTests.java | 10 +++- .../presentation/AccountCommandApiTests.java | 28 +---------- .../presentation/AccountQueryApiTest.java | 16 +----- .../presentation/ArticleCommandApiTests.java | 28 +---------- .../presentation/CommentCommandApiTest.java | 19 +------ .../app/extension/WebApiTestExtension.java | 50 +++++++++++++++++++ 6 files changed, 66 insertions(+), 85 deletions(-) create mode 100644 src/test/java/com/yam/app/extension/WebApiTestExtension.java diff --git a/src/test/java/com/yam/app/ArchUnitTests.java b/src/test/java/com/yam/app/ArchUnitTests.java index a71843b..c303d20 100644 --- a/src/test/java/com/yam/app/ArchUnitTests.java +++ b/src/test/java/com/yam/app/ArchUnitTests.java @@ -1,5 +1,7 @@ package com.yam.app; +import static com.tngtech.archunit.base.DescribedPredicate.alwaysTrue; +import static com.tngtech.archunit.core.domain.properties.HasName.AndFullName.Predicates.fullNameMatching; import static com.tngtech.archunit.library.Architectures.layeredArchitecture; import static com.tngtech.archunit.library.dependencies.SlicesRuleDefinition.slices; @@ -12,7 +14,9 @@ final class ArchUnitTests { @ArchTest ArchRule cycleCheck = slices().matching("com.yam.app.(*)..") - .should().beFreeOfCycles(); + .should().beFreeOfCycles() + .ignoreDependency( + fullNameMatching("com.yam.app.extension.WebApiTestExtension"), alwaysTrue()); @ArchTest ArchRule layerCheck = layeredArchitecture() @@ -28,5 +32,7 @@ final class ArchUnitTests { .whereLayer("Domain").mayOnlyBeAccessedByLayers("Application", "Infrastructure", "Adapter") .whereLayer("Infrastructure").mayOnlyBeAccessedByLayers("Presentation", "Integration") .whereLayer("Adapter").mayNotBeAccessedByAnyLayer() - .whereLayer("Integration").mayNotBeAccessedByAnyLayer(); + .whereLayer("Integration").mayNotBeAccessedByAnyLayer() + .ignoreDependency( + fullNameMatching("com.yam.app.extension.WebApiTestExtension"), alwaysTrue()); } diff --git a/src/test/java/com/yam/app/account/presentation/AccountCommandApiTests.java b/src/test/java/com/yam/app/account/presentation/AccountCommandApiTests.java index 6b0cd37..1c95e92 100644 --- a/src/test/java/com/yam/app/account/presentation/AccountCommandApiTests.java +++ b/src/test/java/com/yam/app/account/presentation/AccountCommandApiTests.java @@ -13,8 +13,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultHandlers. import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.yam.app.account.application.AccountFacade; +import com.yam.app.extension.WebApiTestExtension; import org.javaunit.autoparams.AutoSource; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; @@ -22,34 +21,11 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.NullAndEmptySource; import org.junit.jupiter.params.provider.ValueSource; -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.mock.web.MockHttpSession; -import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.ResultActions; @DisplayName("Account Command HTTP API") -@WebMvcTest(AccountCommandApi.class) -@ActiveProfiles("test") -final class AccountCommandApiTests { - - @Autowired - private MockMvc mockMvc; - @Autowired - private ObjectMapper objectMapper; - @MockBean - private AccountFacade accountFacade; - - private void assertThatInvalidArgumentError(ResultActions actions) throws Exception { - actions - .andExpect(status().isBadRequest()) - .andExpect(jsonPath("$.success").value(false)) - .andExpect(jsonPath("$.data").doesNotExist()) - .andExpect(jsonPath("$.message").value("Invalid argument")); - } +final class AccountCommandApiTests extends WebApiTestExtension { @Nested @DisplayName("회원 정보 수정 HTTP API") diff --git a/src/test/java/com/yam/app/account/presentation/AccountQueryApiTest.java b/src/test/java/com/yam/app/account/presentation/AccountQueryApiTest.java index 86c5b63..d70ed60 100644 --- a/src/test/java/com/yam/app/account/presentation/AccountQueryApiTest.java +++ b/src/test/java/com/yam/app/account/presentation/AccountQueryApiTest.java @@ -5,27 +5,15 @@ import static org.springframework.test.web.servlet.request.MockMvcRequestBuilder import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -import com.yam.app.account.application.AccountFacade; +import com.yam.app.extension.WebApiTestExtension; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; -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.mock.web.MockHttpSession; -import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.web.servlet.MockMvc; @DisplayName("Account Query HTTP API") -@WebMvcTest(AccountQueryApi.class) -@ActiveProfiles("test") -class AccountQueryApiTest { - - @Autowired - private MockMvc mockMvc; - @MockBean - private AccountFacade accountFacade; +class AccountQueryApiTest extends WebApiTestExtension { @Nested @DisplayName("사용자 조회 HTTP API") diff --git a/src/test/java/com/yam/app/article/presentation/ArticleCommandApiTests.java b/src/test/java/com/yam/app/article/presentation/ArticleCommandApiTests.java index 869ba8c..a062a93 100644 --- a/src/test/java/com/yam/app/article/presentation/ArticleCommandApiTests.java +++ b/src/test/java/com/yam/app/article/presentation/ArticleCommandApiTests.java @@ -5,42 +5,18 @@ import static org.springframework.test.web.servlet.request.MockMvcRequestBuilder import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.yam.app.article.application.ArticleFacade; +import com.yam.app.extension.WebApiTestExtension; import java.util.List; import org.javaunit.autoparams.AutoSource; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.NullAndEmptySource; -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.mock.web.MockHttpSession; -import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.ResultActions; @DisplayName("Article Command HTTP API") -@WebMvcTest(ArticleCommandApi.class) -@ActiveProfiles("test") -final class ArticleCommandApiTests { - - @Autowired - private MockMvc mockMvc; - @Autowired - private ObjectMapper objectMapper; - @MockBean - private ArticleFacade articleFacade; - - private void assertThatInvalidArgumentError(ResultActions actions) throws Exception { - actions - .andExpect(status().isBadRequest()) - .andExpect(jsonPath("$.success").value(false)) - .andExpect(jsonPath("$.data").doesNotExist()) - .andExpect(jsonPath("$.message").value("Invalid argument")); - } +final class ArticleCommandApiTests extends WebApiTestExtension { @Nested @DisplayName("게시글 작성 HTTP API") diff --git a/src/test/java/com/yam/app/comment/presentation/CommentCommandApiTest.java b/src/test/java/com/yam/app/comment/presentation/CommentCommandApiTest.java index d7637f8..ab679a0 100644 --- a/src/test/java/com/yam/app/comment/presentation/CommentCommandApiTest.java +++ b/src/test/java/com/yam/app/comment/presentation/CommentCommandApiTest.java @@ -9,8 +9,7 @@ import static org.springframework.test.web.servlet.request.MockMvcRequestBuilder import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.yam.app.comment.application.CommentFacade; +import com.yam.app.extension.WebApiTestExtension; import org.apache.commons.lang3.RandomStringUtils; import org.javaunit.autoparams.AutoSource; import org.javaunit.autoparams.customization.Customization; @@ -20,25 +19,11 @@ import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.NullAndEmptySource; -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.mock.web.MockHttpSession; -import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.web.servlet.MockMvc; @DisplayName("Comment Command HTTP API") -@WebMvcTest(CommentCommandApi.class) -@ActiveProfiles("test") -final class CommentCommandApiTest { - - @Autowired - private MockMvc mockMvc; - @Autowired - private ObjectMapper objectMapper; - @MockBean - private CommentFacade commentFacade; +final class CommentCommandApiTest extends WebApiTestExtension { @Nested @DisplayName("댓글 작성 HTTP API") diff --git a/src/test/java/com/yam/app/extension/WebApiTestExtension.java b/src/test/java/com/yam/app/extension/WebApiTestExtension.java new file mode 100644 index 0000000..e387b10 --- /dev/null +++ b/src/test/java/com/yam/app/extension/WebApiTestExtension.java @@ -0,0 +1,50 @@ +package com.yam.app.extension; + +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.yam.app.account.application.AccountFacade; +import com.yam.app.account.presentation.AccountCommandApi; +import com.yam.app.account.presentation.AccountQueryApi; +import com.yam.app.article.application.ArticleFacade; +import com.yam.app.article.presentation.ArticleCommandApi; +import com.yam.app.comment.application.CommentFacade; +import com.yam.app.comment.presentation.CommentCommandApi; +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.test.context.ActiveProfiles; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.ResultActions; + +@ActiveProfiles("test") +@WebMvcTest( + value = { + AccountCommandApi.class, + AccountQueryApi.class, + ArticleCommandApi.class, + CommentCommandApi.class + } +) +public class WebApiTestExtension { + + @Autowired + protected MockMvc mockMvc; + @Autowired + protected ObjectMapper objectMapper; + @MockBean + protected AccountFacade accountFacade; + @MockBean + protected CommentFacade commentFacade; + @MockBean + protected ArticleFacade articleFacade; + + protected void assertThatInvalidArgumentError(ResultActions actions) throws Exception { + actions + .andExpect(status().isBadRequest()) + .andExpect(jsonPath("$.success").value(false)) + .andExpect(jsonPath("$.data").doesNotExist()) + .andExpect(jsonPath("$.message").value("Invalid argument")); + } +}