Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactor: TestWithDisplayName 어노테이션 구현 및 적용 #35

Merged
merged 4 commits into from
May 23, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,6 @@ public class CakeService {
private final CakeReader cakeReader;

public CakeImageListResponse findCakeImagesByCursorAndCategory(final CakeSearchByCategoryRequest dto) {
return CakeImageListResponse.from(cakeReader.findCakeImagesByCursorAndCategory(dto.cakeId(), dto.category(), dto.pageSize()));
return CakeImageListResponse.from(cakeReader.searchCakeImagesByCursorAndCategory(dto.cakeId(), dto.category(), dto.pageSize()));
}
}
11 changes: 4 additions & 7 deletions cakk-api/src/test/java/com/cakk/api/ArchitectureTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import com.cakk.api.common.annotation.TestWithDisplayName;
import com.tngtech.archunit.core.domain.JavaClasses;
import com.tngtech.archunit.core.importer.ClassFileImporter;
import com.tngtech.archunit.core.importer.ImportOption;
Expand All @@ -24,8 +24,7 @@ static void setUp() {
.importPackages("com.cakk");
}

@DisplayName("response 패키지 안에 있는 클래스들은 Response로 끝나야 한다.")
@Test
@TestWithDisplayName("response 패키지 안에 있는 클래스들은 Response로 끝나야 한다.")
void response() {
ArchRule rule = classes()
.that().resideInAPackage("..response")
Expand All @@ -36,8 +35,7 @@ void response() {
}

@Disabled
@DisplayName("Provider 클래스는 Service, Filter, Provider 클래스에만 의존해야 한다.")
@Test
@TestWithDisplayName("Provider 클래스는 Service, Filter, Provider 클래스에만 의존해야 한다.")
void providerDependency() {
ArchRule rule = classes()
.that().haveNameMatching(".*Provider")
Expand All @@ -49,8 +47,7 @@ void providerDependency() {
rule.check(javaClasses);
}

@DisplayName("Entity는 아무것도 의존하지 않는다.")
@Test
@TestWithDisplayName("Entity는 아무것도 의존하지 않는다.")
void entityNotDependency() {
ArchRule rule = classes()
.that()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
package com.cakk.api.config;
package com.cakk.api.common.annotation;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import org.springframework.security.test.context.support.WithSecurityContext;
import com.cakk.api.common.config.WithMockCustomUserSecurityContextFactory;

@Retention(RetentionPolicy.RUNTIME)
@WithSecurityContext(factory = WithMockCustomUserSecurityContextFactory.class)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package com.cakk.api.common.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Method;

import org.junit.jupiter.api.DisplayNameGeneration;
import org.junit.jupiter.api.DisplayNameGenerator;
import org.junit.jupiter.api.Test;

@Target({ElementType.ANNOTATION_TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Test
@DisplayNameGeneration(TestWithDisplayName.TestDisplayNameGenerator.class)
public @interface TestWithDisplayName {

String value() default "";

class TestDisplayNameGenerator extends DisplayNameGenerator.Standard {

@Override
public String generateDisplayNameForClass(Class<?> testClass) {
final TestWithDisplayName testWithDisplayName = testClass.getAnnotation(TestWithDisplayName.class);

if (testWithDisplayName != null && !testWithDisplayName.value().isEmpty()) {
return testWithDisplayName.value();
}

return super.generateDisplayNameForClass(testClass);
}

@Override
public String generateDisplayNameForMethod(Class<?> testClass, Method testMethod) {
return testMethod.getName();
}
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.cakk.api.config;
package com.cakk.api.common.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
Expand All @@ -7,6 +7,7 @@
import org.springframework.security.test.context.support.WithSecurityContextFactory;
import org.springframework.stereotype.Component;

import com.cakk.api.common.annotation.MockCustomUser;
import com.cakk.api.vo.OAuthUserDetails;
import com.cakk.domain.entity.user.User;
import com.cakk.domain.repository.reader.UserReader;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
import static org.junit.Assert.*;
import static org.springframework.test.context.jdbc.Sql.ExecutionPhase.*;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatusCode;
import org.springframework.http.ResponseEntity;
Expand All @@ -13,6 +12,7 @@
import org.springframework.web.util.UriComponentsBuilder;

import com.cakk.api.common.base.IntegrationTest;
import com.cakk.api.common.annotation.TestWithDisplayName;
import com.cakk.api.dto.response.cake.CakeImageListResponse;
import com.cakk.common.enums.CakeDesignCategory;
import com.cakk.common.enums.ReturnCode;
Expand All @@ -35,8 +35,8 @@ class CakeIntegrationTest extends IntegrationTest {
@Autowired
private CakeCategoryReader cakeCategoryReader;

@Test
void 카테고리로_케이크_이미지_조회에_성공한다() {
@TestWithDisplayName("카테고리로 첫 페이지 케이크 이미지 조회에 성공한다")
void searchByCategory1() {
// given
final String url = "%s%d%s/search/categories".formatted(BASE_URL, port, API_URL);
final UriComponents uriComponents = UriComponentsBuilder
Expand Down Expand Up @@ -65,8 +65,8 @@ class CakeIntegrationTest extends IntegrationTest {
});
}

@Test
void 카테고리로_다음_페이지_케이크_이미지_조회에_성공한다() {
@TestWithDisplayName("카테고리로 첫 페이지가 아닌 케이크 이미지 조회에 성공한다")
void searchByCategory2() {
// given
final String url = "%s%d%s/search/categories".formatted(BASE_URL, port, API_URL);
final UriComponents uriComponents = UriComponentsBuilder
Expand Down Expand Up @@ -96,8 +96,8 @@ class CakeIntegrationTest extends IntegrationTest {
});
}

@Test
void 카테고리로_케이크_이미지_조회_시_데이터가_없으면_빈_배열을_반환한다() {
@TestWithDisplayName("카테고리로 케이크 이미지 조회 시 데이터가 없으면 빈 배열을 반환한다")
void searchByCategory3() {
// given
final String url = "%s%d%s/search/categories".formatted(BASE_URL, port, API_URL);
final UriComponents uriComponents = UriComponentsBuilder
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.springframework.beans.factory.annotation.Value;
Expand All @@ -21,6 +20,7 @@
import io.jsonwebtoken.io.Decoders;
import io.jsonwebtoken.security.Keys;

import com.cakk.api.common.annotation.TestWithDisplayName;
import com.cakk.api.common.base.ProviderTest;
import com.cakk.api.config.JwtConfig;
import com.cakk.api.provider.jwt.JwtProvider;
Expand Down Expand Up @@ -50,8 +50,7 @@ void setup() {
ReflectionTestUtils.setField(jwtProvider, "key", Keys.hmacShaKeyFor(Decoders.BASE64.decode(SECRET_KEY)));
}

@DisplayName("토큰 생성에 성공한다.")
@Test
@TestWithDisplayName("토큰 생성에 성공한다.")
void generateToken1() {
// given
User user = fixtureMonkey.giveMeOne(User.class);
Expand All @@ -65,8 +64,7 @@ void generateToken1() {
Assertions.assertNotNull(jwt.grantType());
}

@DisplayName("User가 null인 경우, 토큰 생성에 실패한다.")
@Test
@TestWithDisplayName("User가 null인 경우, 토큰 생성에 실패한다.")
void generateToken2() {
// given
User user = null;
Expand All @@ -78,8 +76,7 @@ void generateToken2() {
EMPTY_USER.getCode());
}

@DisplayName("액세스 토큰으로부터 인증 정보를 가져온다.")
@Test
@TestWithDisplayName("액세스 토큰으로부터 인증 정보를 가져온다.")
void getAuthentication() {
// given
User user = fixtureMonkey.giveMeOne(User.class);
Expand All @@ -95,8 +92,7 @@ void getAuthentication() {
Assertions.assertEquals(authentication.getAuthorities().toString(), "[%s]".formatted(USER.getSecurityRole()));
}

@DisplayName("토큰으로부터 Claim 정보를 가져온다.")
@Test
@TestWithDisplayName("토큰으로부터 Claim 정보를 가져온다.")
void parseClaims() {
// given
User user = fixtureMonkey.giveMeOne(User.class);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import org.mockito.InjectMocks;
import org.mockito.Mock;

import com.cakk.api.common.annotation.TestWithDisplayName;
import com.cakk.api.common.base.ServiceTest;
import com.cakk.api.dto.request.cake.CakeSearchByCategoryRequest;
import com.cakk.api.dto.response.cake.CakeImageListResponse;
Expand All @@ -27,13 +27,13 @@ class CakeServiceTest extends ServiceTest {
@Mock
private CakeReader cakeReader;

@Test
void 카테고리에_해당하는_케이크_목록을_조회한다() {
@TestWithDisplayName("카테고리에 해당하는 케이크 목록을 조회한다")
void findCakeImagesByCursorAndCategory1() {
// given
CakeSearchByCategoryRequest dto = new CakeSearchByCategoryRequest(null, CakeDesignCategory.FLOWER, 3);
List<CakeImageResponseParam> cakeImages = getConstructorMonkey().giveMe(CakeImageResponseParam.class, 3);

doReturn(cakeImages).when(cakeReader).findCakeImagesByCursorAndCategory(dto.cakeId(), dto.category(), dto.pageSize());
doReturn(cakeImages).when(cakeReader).searchCakeImagesByCursorAndCategory(dto.cakeId(), dto.category(), dto.pageSize());

// when
CakeImageListResponse result = cakeService.findCakeImagesByCursorAndCategory(dto);
Expand All @@ -42,16 +42,16 @@ class CakeServiceTest extends ServiceTest {
Assertions.assertEquals(cakeImages.size(), result.cakeImages().size());
Assertions.assertNotNull(result.lastCakeId());

verify(cakeReader).findCakeImagesByCursorAndCategory(dto.cakeId(), dto.category(), dto.pageSize());
verify(cakeReader).searchCakeImagesByCursorAndCategory(dto.cakeId(), dto.category(), dto.pageSize());
}

@Test
void 카테고리에_해당하는_케이크가_없을_시_빈_배열을_리턴한다() {
@TestWithDisplayName("카테고리에 해당하는 케이크가 없을 시 빈 배열을 리턴한다.")
void findCakeImagesByCursorAndCategory2() {
// given
CakeSearchByCategoryRequest dto = new CakeSearchByCategoryRequest(null, CakeDesignCategory.FLOWER, 3);
List<CakeImageResponseParam> cakeImages = getConstructorMonkey().giveMe(CakeImageResponseParam.class, 0);

doReturn(cakeImages).when(cakeReader).findCakeImagesByCursorAndCategory(dto.cakeId(), dto.category(), dto.pageSize());
doReturn(cakeImages).when(cakeReader).searchCakeImagesByCursorAndCategory(dto.cakeId(), dto.category(), dto.pageSize());

// when
CakeImageListResponse result = cakeService.findCakeImagesByCursorAndCategory(dto);
Expand All @@ -60,6 +60,6 @@ class CakeServiceTest extends ServiceTest {
Assertions.assertEquals(cakeImages.size(), result.cakeImages().size());
Assertions.assertNull(result.lastCakeId());

verify(cakeReader).findCakeImagesByCursorAndCategory(dto.cakeId(), dto.category(), dto.pageSize());
verify(cakeReader).searchCakeImagesByCursorAndCategory(dto.cakeId(), dto.category(), dto.pageSize());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,18 @@
import static org.mockito.Mockito.*;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;

import net.jqwik.api.Arbitraries;

import com.cakk.api.common.annotation.TestWithDisplayName;
import com.cakk.api.common.base.ServiceTest;
import com.cakk.api.dto.request.user.UserSignInRequest;
import com.cakk.api.dto.request.user.UserSignUpRequest;
import com.cakk.api.dto.response.user.JwtResponse;
import com.cakk.api.factory.OidcProviderFactory;
import com.cakk.api.provider.jwt.JwtProvider;
import com.cakk.api.service.user.UserService;
import com.cakk.api.vo.JsonWebToken;
import com.cakk.common.enums.ReturnCode;
import com.cakk.common.exception.CakkException;
Expand All @@ -41,8 +40,8 @@ class UserServiceTest extends ServiceTest {
@Mock
private UserWriter userWriter;

@Test
void 회원가입에_성공한다() {
@TestWithDisplayName("회원가입에 성공한다")
void signUp1() {
// given
UserSignUpRequest dto = getConstructorMonkey().giveMeOne(UserSignUpRequest.class);
User user = getReflectionMonkey().giveMeBuilder(User.class)
Expand Down Expand Up @@ -73,8 +72,8 @@ class UserServiceTest extends ServiceTest {
verify(jwtProvider, times(1)).generateToken(user);
}

@Test
void 만료된_id_token이라면_회원가입_시_에러를_던진다() {
@TestWithDisplayName("만료된 id token이라면 회원가입 시 에러를 던진다")
void signUp2() {
// given
UserSignUpRequest dto = getConstructorMonkey().giveMeOne(UserSignUpRequest.class);
User user = getReflectionMonkey().giveMeBuilder(User.class)
Expand All @@ -96,8 +95,8 @@ class UserServiceTest extends ServiceTest {
verify(jwtProvider, times(0)).generateToken(user);
}

@Test
void 로그인에_성공한다() {
@TestWithDisplayName("로그인에 성공한다.")
void signIn() {
// given
UserSignInRequest dto = getConstructorMonkey().giveMeOne(UserSignInRequest.class);
String providerId = Arbitraries.strings().alpha().ofMinLength(10).ofMaxLength(20).sample();
Expand Down Expand Up @@ -129,8 +128,8 @@ class UserServiceTest extends ServiceTest {
verify(jwtProvider, times(1)).generateToken(user);
}

@Test
void 제공자_id에_해당하는_유저가_없다면_로그인_시_에러를_던진다() {
@TestWithDisplayName("제공자 id에 해당하는 유저가 없다면 로그인 시 에러를 던진다")
void signIn2() {
// given
UserSignInRequest dto = getConstructorMonkey().giveMeOne(UserSignInRequest.class);
String providerId = Arbitraries.strings().alpha().ofMinLength(10).ofMaxLength(20).sample();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ public class CakeQueryRepository {

private final JPAQueryFactory queryFactory;

public List<CakeImageResponseParam> findCakeImagesByCursorAndCategory(Long cakeId, CakeDesignCategory category, int pageSize) {
public List<CakeImageResponseParam> searchCakeImagesByCursorAndCategory(Long cakeId, CakeDesignCategory category, int pageSize) {
return queryFactory
.select(Projections.constructor(CakeImageResponseParam.class,
cakeShop.id,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ public Cake findById(Long cakeId) {
return cakeJpaRepository.findById(cakeId).orElseThrow(() -> new CakkException(ReturnCode.NOT_EXIST_CAKE));
}

public List<CakeImageResponseParam> findCakeImagesByCursorAndCategory(Long cakeId, CakeDesignCategory category, int pageSize) {
return cakeQueryRepository.findCakeImagesByCursorAndCategory(cakeId, category, pageSize);
public List<CakeImageResponseParam> searchCakeImagesByCursorAndCategory(Long cakeId, CakeDesignCategory category, int pageSize) {
return cakeQueryRepository.searchCakeImagesByCursorAndCategory(cakeId, category, pageSize);
}
}
Loading