Skip to content

Commit

Permalink
Merge pull request #81 from MARU-EGG/test/테스트-개선
Browse files Browse the repository at this point in the history
[test] 테스트 개선
  • Loading branch information
Hoya324 authored Sep 3, 2024
2 parents c73fd13 + 9975acd commit 6d5569c
Show file tree
Hide file tree
Showing 10 changed files with 209 additions and 165 deletions.
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

0 comments on commit 6d5569c

Please sign in to comment.