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

[test] 테스트 개선 #81

Merged
merged 2 commits into from
Sep 3, 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
@@ -1,40 +1,58 @@
package mju.iphak.maru_egg.answer.api;

import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;

import java.util.List;

import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.MockitoAnnotations;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.security.test.context.support.WithMockUser;
import org.springframework.test.web.servlet.ResultActions;
import org.springframework.test.web.servlet.ResultMatcher;

import jakarta.persistence.EntityNotFoundException;
import mju.iphak.maru_egg.answer.application.AnswerManager;
import mju.iphak.maru_egg.answer.domain.Answer;
import mju.iphak.maru_egg.answer.dto.request.UpdateAnswerContentRequest;
import mju.iphak.maru_egg.answer.repository.AnswerRepository;
import mju.iphak.maru_egg.common.IntegrationTest;
import mju.iphak.maru_egg.question.domain.Question;
import mju.iphak.maru_egg.question.domain.QuestionCategory;
import mju.iphak.maru_egg.question.domain.QuestionType;
import mju.iphak.maru_egg.question.repository.QuestionRepository;

@WithMockUser(roles = "ADMIN")
class AdminAnswerControllerTest extends IntegrationTest {

@MockBean
@Autowired
private AnswerManager answerManager;

@Autowired
private QuestionRepository questionRepository;

@Autowired
private AnswerRepository answerRepository;

@BeforeEach
void setUp() {
MockitoAnnotations.openMocks(this);
initializeTestData();
}

@AfterEach
void tearDown() {
answerRepository.deleteAllInBatch();
questionRepository.deleteAllInBatch();
}

@Test
void 답변_수정_API_정상적인_요청() throws Exception {
// given
UpdateAnswerContentRequest request = new UpdateAnswerContentRequest(1L, "새로운 답변 내용");
Long questionId = getFirstQuestionId();
UpdateAnswerContentRequest request = new UpdateAnswerContentRequest(questionId, "새로운 답변 내용");

// when & then
performRequestAndExpectStatus(request, status().isOk());
Expand All @@ -53,23 +71,11 @@ void setUp() {
void 답변_수정_API_존재하지_않는_답변_ID() throws Exception {
// given
UpdateAnswerContentRequest request = new UpdateAnswerContentRequest(999L, "새로운 답변 내용");
doThrow(new EntityNotFoundException("답변을 찾을 수 없습니다.")).when(answerManager)
.updateAnswerContent(anyLong(), anyString());

// when & then
performRequestAndExpectStatus(request, status().isNotFound());
}

@Test
void 답변_수정_API_서버_내부_오류() throws Exception {
// given
UpdateAnswerContentRequest request = new UpdateAnswerContentRequest(1L, "새로운 답변 내용");
doThrow(new RuntimeException("내부 서버 오류")).when(answerManager).updateAnswerContent(anyLong(), anyString());

// when & then
performRequestAndExpectStatus(request, status().isInternalServerError());
}

private void performRequestAndExpectStatus(Object content, ResultMatcher expectedStatus) throws Exception {
ResultActions resultActions = mvc.perform(put("/api/admin/answers")
.contentType(MediaType.APPLICATION_JSON)
Expand All @@ -85,4 +91,17 @@ private void performRequestAndExpectStatus(String content, ResultMatcher expecte

resultActions.andExpect(expectedStatus).andDo(print());
}

private void initializeTestData() {
Question question = Question.of("질문", "질문", QuestionType.SUSI, QuestionCategory.ADMISSION_GUIDELINE);
Answer answer = Answer.of(question, "답변");

questionRepository.saveAndFlush(question);
answerRepository.saveAndFlush(answer);
}

private Long getFirstQuestionId() {
List<Question> questions = questionRepository.findAll();
return questions.get(0).getId();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,24 +16,14 @@
import jakarta.persistence.EntityNotFoundException;
import mju.iphak.maru_egg.answer.domain.Answer;
import mju.iphak.maru_egg.answer.dto.request.CreateAnswerRequest;
import mju.iphak.maru_egg.answer.repository.AnswerReferenceRepository;
import mju.iphak.maru_egg.answer.repository.AnswerRepository;
import mju.iphak.maru_egg.common.MockTest;
import mju.iphak.maru_egg.question.domain.Question;
import mju.iphak.maru_egg.question.domain.QuestionCategory;
import mju.iphak.maru_egg.question.domain.QuestionType;
import mju.iphak.maru_egg.question.dto.request.CreateQuestionRequest;
import mju.iphak.maru_egg.question.repository.QuestionRepository;

public class AnswerManagerTest {

@Mock
private QuestionRepository questionRepository;

@Mock
private AnswerApiClient answerApiClient;

@Mock
private AnswerReferenceRepository answerReferenceRepository;
public class AnswerManagerTest extends MockTest {

@Mock
private AnswerRepository answerRepository;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.boot.test.mock.mockito.SpyBean;
import org.springframework.http.MediaType;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.test.web.servlet.MockMvc;
Expand All @@ -29,7 +29,7 @@ class AuthControllerTest extends IntegrationTest {
@Autowired
private ObjectMapper objectMapper;

@MockBean
@SpyBean
private AuthService authService;

@Autowired
Expand Down
6 changes: 0 additions & 6 deletions src/test/java/mju/iphak/maru_egg/common/MockTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,9 @@
import org.junit.Ignore;
import org.junit.runner.RunWith;
import org.mockito.junit.MockitoJUnitRunner;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.annotation.Import;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.TestPropertySource;

import mju.iphak.maru_egg.TestcontainersConfiguration;

@Import(TestcontainersConfiguration.class)
@SpringBootTest
@ActiveProfiles("test")
@RunWith(MockitoJUnitRunner.class)
@TestPropertySource(properties = {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,43 +1,52 @@
package mju.iphak.maru_egg.question.api;

import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;

import java.util.List;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.MockitoAnnotations;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.security.test.context.support.WithMockUser;
import org.springframework.test.web.servlet.ResultActions;

import jakarta.persistence.EntityNotFoundException;
import mju.iphak.maru_egg.answer.domain.Answer;
import mju.iphak.maru_egg.answer.dto.request.CreateAnswerRequest;
import mju.iphak.maru_egg.answer.repository.AnswerRepository;
import mju.iphak.maru_egg.common.IntegrationTest;
import mju.iphak.maru_egg.question.application.QuestionService;
import mju.iphak.maru_egg.question.domain.Question;
import mju.iphak.maru_egg.question.domain.QuestionCategory;
import mju.iphak.maru_egg.question.domain.QuestionType;
import mju.iphak.maru_egg.question.dto.request.CheckQuestionRequest;
import mju.iphak.maru_egg.question.dto.request.CreateQuestionRequest;
import mju.iphak.maru_egg.question.repository.QuestionRepository;

@WithMockUser(roles = "ADMIN")
class AdminQuestionControllerTest extends IntegrationTest {

@MockBean
@Autowired
private QuestionService questionService;

@Autowired
private QuestionRepository questionRepository;

@Autowired
private AnswerRepository answerRepository;

@BeforeEach
void setUp() {
MockitoAnnotations.openMocks(this);
initializeTestData();
}

@Test
void 질문_체크_API_정상적인_요청() throws Exception {
// given
CheckQuestionRequest request = new CheckQuestionRequest(1L);
Long questionId = getFirstQuestionId();
CheckQuestionRequest request = new CheckQuestionRequest(questionId);

// when
ResultActions resultActions = performCheckQuestionRequest(request);
Expand All @@ -62,8 +71,6 @@ void setUp() {
void 질문_체크_API_존재하지_않는_질문_ID() throws Exception {
// given
CheckQuestionRequest request = new CheckQuestionRequest(999L);
doThrow(new EntityNotFoundException("질문을 찾을 수 없습니다.")).when(questionService)
.checkQuestion(anyLong());

// when
ResultActions resultActions = performCheckQuestionRequest(request);
Expand All @@ -72,20 +79,6 @@ void setUp() {
resultActions.andExpect(status().isNotFound());
}

@Test
void 질문_체크_API_서버_내부_오류() throws Exception {
// given
CheckQuestionRequest request = new CheckQuestionRequest(1L);
doThrow(new RuntimeException("내부 서버 오류")).when(questionService)
.checkQuestion(anyLong());

// when
ResultActions resultActions = performCheckQuestionRequest(request);

// then
resultActions.andExpect(status().isInternalServerError());
}

@Test
void 질문_생성_API() throws Exception {
// given
Expand All @@ -101,7 +94,7 @@ void setUp() {
@Test
void 질문_삭제_API() throws Exception {
// given
Long id = 1L;
Long id = getFirstQuestionId();

// when
ResultActions resultActions = performDeleteQuestionRequest(id);
Expand All @@ -110,6 +103,11 @@ void setUp() {
resultActions.andExpect(status().isOk());
}

private Long getFirstQuestionId() {
List<Question> questions = questionRepository.findAll();
return questions.get(0).getId();
}

private ResultActions performCheckQuestionRequest(CheckQuestionRequest request) throws Exception {
return mvc.perform(put("/api/admin/questions/check")
.contentType(MediaType.APPLICATION_JSON)
Expand Down Expand Up @@ -142,4 +140,12 @@ private CreateQuestionRequest createSampleCreateQuestionRequest() {
QuestionCategory.ADMISSION_GUIDELINE,
new CreateAnswerRequest("example answer content", 2024));
}

private void initializeTestData() {
Question question = Question.of("질문", "질문", QuestionType.SUSI, QuestionCategory.ADMISSION_GUIDELINE);
Answer answer = Answer.of(question, "답변");

questionRepository.saveAndFlush(question);
answerRepository.saveAndFlush(answer);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.mockito.MockitoAnnotations;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.security.test.context.support.WithMockUser;
Expand All @@ -26,15 +25,14 @@ class AdminQuestionTypeStatusControllerTest extends IntegrationTest {

@BeforeEach
void setUp() {
MockitoAnnotations.openMocks(this);
questionTypeStatusService.initializeQuestionTypeStatus();
questionTypeStatusService.deleteQuestionTypeStatus(QuestionType.JEONGSI);
}

@DisplayName("200 질문 상태 초기화")
@Test
public void 질문_상태_초기화_API_정상적인_요청() throws Exception {
// given // when
// given & when
ResultActions resultActions = performInitializeQuestionTypeStatus();

// then
Expand Down Expand Up @@ -80,5 +78,4 @@ private ResultActions performUpdateQuestionTypeStatus(UpdateQuestionTypeStatusRe
.content(objectMapper.writeValueAsString(request)))
.andDo(print());
}

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ class QuestionControllerTest extends IntegrationTest {
@BeforeEach
void setUp() {
setupDatabase();
setupEntities();
initializeTestData();
}

private void setupDatabase() {
Expand All @@ -76,7 +76,7 @@ private void setupDatabase() {
jdbcTemplate.execute("ALTER TABLE questions ADD FULLTEXT INDEX idx_ft_question_content(content)");
}

private void setupEntities() {
private void initializeTestData() {
content = "수시 원서 일정 알려주세요.";
question = questionRepository.save(
Question.of(content, "수시 일정", QuestionType.SUSI, QuestionCategory.ADMISSION_GUIDELINE));
Expand Down
Loading
Loading