Skip to content

Commit

Permalink
Refactor | CAKK-58 | 테스트 코드 리팩토링
Browse files Browse the repository at this point in the history
  • Loading branch information
komment-dev committed Aug 28, 2024
1 parent 1afba4d commit 38fce4a
Show file tree
Hide file tree
Showing 11 changed files with 296 additions and 61 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package com.cakk.api.common.base;

import java.time.LocalDate;

import org.junit.jupiter.api.extension.ExtendWith;
import org.locationtech.jts.geom.Coordinate;
import org.locationtech.jts.geom.GeometryFactory;
Expand All @@ -18,6 +20,7 @@
import com.navercorp.fixturemonkey.jakarta.validation.plugin.JakartaValidationPlugin;

import com.cakk.common.enums.Provider;
import com.cakk.common.enums.Role;
import com.cakk.domain.mysql.config.JpaConfig;
import com.cakk.domain.mysql.entity.user.User;

Expand Down Expand Up @@ -55,10 +58,14 @@ protected final FixtureMonkey getBuilderMonkey() {
}

protected User getUser() {
return getReflectionMonkey().giveMeBuilder(User.class)
return getConstructorMonkey().giveMeBuilder(User.class)
.set("id", Arbitraries.longs().greaterOrEqual(10))
.set("provider", Arbitraries.of(Provider.class))
.set("providerId", Arbitraries.strings().withCharRange('a', 'z').ofMinLength(1).ofMaxLength(50))
.set("email", Arbitraries.strings().withCharRange('a', 'z').ofMinLength(1).ofMaxLength(50))
.set("nickname", Arbitraries.strings().withCharRange('a', 'z').ofMinLength(1).ofMaxLength(50))
.set("birthday", LocalDate.now())
.set("role", Arbitraries.of(Role.class))
.sample();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
import static org.springframework.test.context.jdbc.Sql.ExecutionPhase.*;

import java.time.LocalDate;
import java.util.Map;

import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
Expand All @@ -28,11 +27,12 @@
import com.cakk.common.exception.CakkException;
import com.cakk.common.response.ApiResponse;
import com.cakk.domain.mysql.entity.user.User;
import com.cakk.domain.mysql.repository.reader.UserReader;

@SqlGroup({
@Sql(scripts = {
"/sql/insert-test-user.sql"
"/sql/insert-test-user.sql",
"/sql/insert-cake-shop.sql",
"/sql/insert-heart.sql",
}, executionPhase = BEFORE_TEST_METHOD),
@Sql(scripts = "/sql/delete-all.sql", executionPhase = AFTER_TEST_METHOD)
})
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@
import com.cakk.common.enums.ReturnCode;
import com.cakk.common.exception.CakkException;
import com.cakk.domain.mysql.entity.user.User;
import com.cakk.domain.mysql.facade.user.UserCommandFacade;
import com.cakk.domain.mysql.repository.reader.UserReader;
import com.cakk.domain.mysql.repository.writer.UserWriter;
import com.cakk.domain.redis.repository.TokenRedisRepository;

@DisplayName("Sign 관련 비즈니스 로직 테스트")
Expand All @@ -42,7 +42,7 @@ class SignServiceTest extends ServiceTest {
private UserReader userReader;

@Mock
private UserWriter userWriter;
private UserCommandFacade userCommandFacade;

@Mock
private TokenRedisRepository tokenRedisRepository;
Expand All @@ -51,7 +51,7 @@ class SignServiceTest extends ServiceTest {
void signUp1() {
// given
UserSignUpRequest dto = getConstructorMonkey().giveMeOne(UserSignUpRequest.class);
User user = getReflectionMonkey().giveMeBuilder(User.class)
User user = getConstructorMonkey().giveMeBuilder(User.class)
.set("id", Arbitraries.longs().greaterOrEqual(10))
.set("provider", dto.provider())
.set("providerId", Arbitraries.strings().alpha().ofMinLength(10).ofMaxLength(20))
Expand All @@ -63,7 +63,7 @@ void signUp1() {
.sample();

doReturn(user.getProviderId()).when(oidcProviderFactory).getProviderId(dto.provider(), dto.idToken());
doReturn(user).when(userWriter).create(any(User.class));
doReturn(user).when(userCommandFacade).create(any(User.class));
doReturn(jwt).when(jwtProvider).generateToken(user);

// when
Expand All @@ -75,15 +75,15 @@ void signUp1() {
Assertions.assertNotNull(result.grantType());

verify(oidcProviderFactory, times(1)).getProviderId(dto.provider(), dto.idToken());
verify(userWriter, times(1)).create(any(User.class));
verify(userCommandFacade, times(1)).create(any(User.class));
verify(jwtProvider, times(1)).generateToken(user);
}

@TestWithDisplayName("만료된 id token이라면 회원가입 시 에러를 던진다")
void signUp2() {
// given
UserSignUpRequest dto = getConstructorMonkey().giveMeOne(UserSignUpRequest.class);
User user = getReflectionMonkey().giveMeBuilder(User.class)
User user = getConstructorMonkey().giveMeBuilder(User.class)
.set("id", Arbitraries.longs().greaterOrEqual(10))
.set("provider", dto.provider())
.set("providerId", Arbitraries.strings().alpha().ofMinLength(10).ofMaxLength(20))
Expand All @@ -98,7 +98,7 @@ void signUp2() {
ReturnCode.EXPIRED_JWT_TOKEN.getMessage());

verify(oidcProviderFactory, times(1)).getProviderId(dto.provider(), dto.idToken());
verify(userWriter, times(0)).create(any(User.class));
verify(userCommandFacade, times(0)).create(any(User.class));
verify(jwtProvider, times(0)).generateToken(user);
}

Expand All @@ -107,7 +107,7 @@ void signIn() {
// given
UserSignInRequest dto = getConstructorMonkey().giveMeOne(UserSignInRequest.class);
String providerId = Arbitraries.strings().alpha().ofMinLength(10).ofMaxLength(20).sample();
User user = getReflectionMonkey().giveMeBuilder(User.class)
User user = getConstructorMonkey().giveMeBuilder(User.class)
.set("id", Arbitraries.longs().greaterOrEqual(10))
.set("provider", dto.provider())
.set("providerId", providerId)
Expand Down Expand Up @@ -140,7 +140,7 @@ void signIn2() {
// given
UserSignInRequest dto = getConstructorMonkey().giveMeOne(UserSignInRequest.class);
String providerId = Arbitraries.strings().alpha().ofMinLength(10).ofMaxLength(20).sample();
User user = getReflectionMonkey().giveMeBuilder(User.class)
User user = getConstructorMonkey().giveMeBuilder(User.class)
.set("id", Arbitraries.longs().greaterOrEqual(10))
.set("provider", dto.provider())
.set("providerId", providerId)
Expand All @@ -164,7 +164,7 @@ void signIn2() {
void recreateToken() {
// given
final String refreshToken = "refresh token";
final User user = getReflectionMonkey().giveMeBuilder(User.class)
final User user = getConstructorMonkey().giveMeBuilder(User.class)
.set("id", Arbitraries.longs().greaterOrEqual(10))
.set("providerId", Arbitraries.strings().alpha().ofMinLength(10).ofMaxLength(20))
.set("createdAt", LocalDateTime.now())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,8 @@
import com.cakk.common.enums.ReturnCode;
import com.cakk.common.exception.CakkException;
import com.cakk.domain.mysql.entity.user.User;
import com.cakk.domain.mysql.facade.user.UserCommandFacade;
import com.cakk.domain.mysql.repository.reader.UserReader;
import com.cakk.domain.mysql.repository.writer.BusinessInformationWriter;
import com.cakk.domain.mysql.repository.writer.CakeHeartWriter;
import com.cakk.domain.mysql.repository.writer.CakeShopHeartWriter;
import com.cakk.domain.mysql.repository.writer.UserWriter;

@DisplayName("유저 관련 비즈니스 로직 테스트")
class UserServiceTest extends ServiceTest {
Expand All @@ -33,21 +30,12 @@ class UserServiceTest extends ServiceTest {
private UserReader userReader;

@Mock
private UserWriter userWriter;

@Mock
private CakeShopHeartWriter cakeShopHeartWriter;

@Mock
private CakeHeartWriter cakeHeartWriter;

@Mock
private BusinessInformationWriter businessInformationWriter;
private UserCommandFacade userCommandFacade;

@TestWithDisplayName("유저 프로필을 조회한다.")
void findProfile1() {
// given
final User user = getReflectionMonkey().giveMeBuilder(User.class)
final User user = getConstructorMonkey().giveMeBuilder(User.class)
.set("id", Arbitraries.longs().greaterOrEqual(10))
.set("provider", Arbitraries.of(Provider.class))
.set("providerId", Arbitraries.strings().withCharRange('a', 'z').ofMinLength(1).ofMaxLength(50))
Expand All @@ -67,7 +55,7 @@ void findProfile1() {
@TestWithDisplayName("유저가 존재하지 않으면 유저 프로필 조회에 실패한다.")
void findProfile2() {
// given
final User user = getReflectionMonkey().giveMeBuilder(User.class)
final User user = getConstructorMonkey().giveMeBuilder(User.class)
.set("id", Arbitraries.longs().greaterOrEqual(10))
.set("provider", Arbitraries.of(Provider.class))
.set("providerId", Arbitraries.strings().withCharRange('a', 'z').ofMinLength(1).ofMaxLength(50))
Expand All @@ -86,7 +74,7 @@ void findProfile2() {
@TestWithDisplayName("유저 프로필을 수정한다.")
void updateInformation() {
// given
final User user = getReflectionMonkey().giveMeBuilder(User.class)
final User user = getConstructorMonkey().giveMeBuilder(User.class)
.set("id", Arbitraries.longs().greaterOrEqual(10))
.set("provider", Arbitraries.of(Provider.class))
.set("providerId", Arbitraries.strings().withCharRange('a', 'z').ofMinLength(1).ofMaxLength(50))
Expand All @@ -104,44 +92,30 @@ void updateInformation() {
@TestWithDisplayName("유저를 탈퇴한다.")
void withdraw1() {
// given
final User user = getReflectionMonkey().giveMeBuilder(User.class)
.set("id", Arbitraries.longs().greaterOrEqual(10))
.set("provider", Arbitraries.of(Provider.class))
.set("providerId", Arbitraries.strings().withCharRange('a', 'z').ofMinLength(1).ofMaxLength(50))
.sample();
final User user = getUser();

doReturn(user).when(userReader).findByUserId(user.getId());
doReturn(user).when(userReader).findByIdWithAll(user.getId());

// when & then
Assertions.assertDoesNotThrow(() -> userService.withdraw(user));

verify(userReader, times(1)).findByUserId(user.getId());
verify(cakeHeartWriter, times(1)).deleteAllByUser(user);
verify(cakeShopHeartWriter, times(1)).deleteAllByUser(user);
verify(businessInformationWriter, times(1)).deleteAllByUser(user);
verify(userWriter, times(1)).delete(any(), any());
verify(userReader, times(1)).findByIdWithAll(user.getId());
verify(userCommandFacade, times(1)).withdraw(any(), any());
}

@TestWithDisplayName("유저가 없는 경우, 탈퇴에 실패한다.")
void withdraw2() {
// given
final User user = getReflectionMonkey().giveMeBuilder(User.class)
.set("id", Arbitraries.longs().greaterOrEqual(10))
.set("provider", Arbitraries.of(Provider.class))
.set("providerId", Arbitraries.strings().withCharRange('a', 'z').ofMinLength(1).ofMaxLength(50))
.sample();
final User user = getUser();

doThrow(new CakkException(ReturnCode.NOT_EXIST_USER)).when(userReader).findByUserId(user.getId());
doThrow(new CakkException(ReturnCode.NOT_EXIST_USER)).when(userReader).findByIdWithAll(user.getId());

// when & then
Assertions.assertThrows(CakkException.class,
() -> userService.withdraw(user),
ReturnCode.NOT_EXIST_USER.getMessage());

verify(userReader, times(1)).findByUserId(user.getId());
verify(cakeHeartWriter, times(0)).deleteAllByUser(user);
verify(cakeShopHeartWriter, times(0)).deleteAllByUser(user);
verify(businessInformationWriter, times(0)).deleteAllByUser(user);
verify(userWriter, times(0)).delete(any(), any());
verify(userReader, times(1)).findByIdWithAll(user.getId());
verify(userCommandFacade, never()).withdraw(any(), any());
}
}
2 changes: 2 additions & 0 deletions cakk-domain/mysql/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ dependencies {
testImplementation("com.navercorp.fixturemonkey:fixture-monkey-starter:1.0.23")
testImplementation('org.assertj:assertj-core')
testImplementation('org.junit.jupiter:junit-jupiter')
testImplementation('org.mockito:mockito-core')
testImplementation('org.mockito:mockito-junit-jupiter')
testRuntimeOnly('org.junit.platform:junit-platform-launcher')

// querydsl
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package com.cakk.domain.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
Expand Up @@ -59,7 +59,7 @@ protected static Point supplyPointBy(Double latitude, Double longitude) {
}

protected User getUserFixture(Role role) {
return getReflectionMonkey().giveMeBuilder(User.class)
return getConstructorMonkey().giveMeBuilder(User.class)
.set("id", Arbitraries.longs().greaterOrEqual(10))
.set("email", Arbitraries.strings().withCharRange('a', 'z').ofMaxLength(50))
.set("role", role)
Expand Down Expand Up @@ -94,7 +94,7 @@ protected BusinessInformation getBusinessInformationFixtureWithCakeShop(Verifica
}

protected CertificationParam getCertificationParamFixtureWithUser(User user) {
return getBuilderMonkey().giveMeBuilder(CertificationParam.class)
return getConstructorMonkey().giveMeBuilder(CertificationParam.class)
.set("businessRegistrationImageUrl", Arbitraries.strings().withCharRange('a', 'z').ofMinLength(1).ofMaxLength(20))
.set("idCardImageUrl", Arbitraries.strings().withCharRange('a', 'z').ofMinLength(1).ofMaxLength(20))
.set("cakeShopId", Arbitraries.longs().greaterOrEqual(0))
Expand Down
Loading

0 comments on commit 38fce4a

Please sign in to comment.