강의

멘토링

로드맵

Inflearn brand logo image

인프런 커뮤니티 질문&답변

sh hyeogi365님의 프로필 이미지
sh hyeogi365

작성한 질문수

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

스프링 통합 테스트

통합테스트가 안되면 실행이 안된다는 뜻인가요?

작성

·

242

·

수정됨

0



[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (/아니오)

[질문 내용]
CONDITIONS EVALUATION REPORT 라고 에러메시지가 뜨면서 서비스통합테스트가 뜨는데 그럴땐 어디를 봐야 하나요? 서비스테스트랑 코드문은 똑같습니다.

스크린샷(487).png.webp
plugins {
    id 'java'
    id 'org.springframework.boot' version '3.4.1'
    id 'io.spring.dependency-management' version '1.1.7'
}

group = 'hhdplus'
version = '0.0.1-SNAPSHOT'

java {
    toolchain {
       languageVersion = JavaLanguageVersion.of(17)
    }
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'

    annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    runtimeOnly 'com.mysql:mysql-connector-j'
    testImplementation('org.springframework.boot:spring-boot-starter-test') {
       exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
    }
    testRuntimeOnly 'org.junit.platform:junit-platform-launcher'

    implementation 'org.apache.tomcat.embed:tomcat-embed-jasper'
    implementation 'javax.servlet:jstl'
}

tasks.named('test') {
    useJUnitPlatform()
}
package hhdplus.hhplus_tdd2.service;

import hhdplus.hhplus_tdd2.domain.reserve.Reserve;
import hhdplus.hhplus_tdd2.domain.reserve.ReserveCommand;
import hhdplus.hhplus_tdd2.domain.reserve.ReserveInfo;
import hhdplus.hhplus_tdd2.domain.reserve.ReserveService;
import hhdplus.hhplus_tdd2.infra.reserve.ReserveRepository;
import hhdplus.hhplus_tdd2.interfaces.controller.ReserveRequest;
import hhdplus.hhplus_tdd2.interfaces.controller.ReserveResponse;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

@SpringBootTest
//@ExtendWith(MockitoExtension.class)
public class ReserveServiceIntergrationTest {

    @Autowired
    ReserveService reserveService;
    @Autowired
    ReserveRepository reserveRepository;

    ReserveRequest reserveRequest = new ReserveRequest();
    ReserveResponse reserveResponse = new ReserveResponse();
    Reserve reserve = new Reserve();

    //동작하기 전에 넣어준다 BeforeEach
//    @BeforeEach
//    public void beforeEach() {
//        MockitoAnnotations.openMocks(this); // Mock 객체 초기화
//    }
//
//    @AfterEach //테스트 돌때마다 초기화
//    public void afterEach() {
//        Mockito.reset(reserveRepository); // Mock 상태 초기화
//    }

    @Test
    void 아이디별_예약_내역() {

        //given 뭔가가 주어졌는데
        int userId = 1;

        ReserveInfo mockReserveInfo = new ReserveInfo();
        mockReserveInfo.setId(1);
        mockReserveInfo.setUserId(userId);
        mockReserveInfo.setName("테스트 예약 정보");

        List<ReserveInfo> mockReserveList = List.of(mockReserveInfo);

        // Mock 동작 설정
        when(reserveService.findReservation(1)).thenReturn(mockReserveList);

        //when 이거를 실행했을 떄
        List<ReserveInfo> result = reserveService.findReservation(userId);

        //then 결과가 이게 나와야 돼
        if(result != null){
            System.out.println("이름 : " + mockReserveInfo.getName());
        }

        assertThat(result).isNotNull();
        assertThat(result.size()).isEqualTo(1);
        assertThat(result.get(0).getUserId()).isEqualTo(userId);
    }

    @Test
    void 예약하기() {//40명이 예약 한다 쳐보면 30명만 예약이 되게끔 해보기
        //given 뭔가가 주어졌는데
        ReserveResponse reserveResponse = new ReserveResponse();
        reserveResponse.setId(1);
        reserveResponse.setUserId(1);
        reserveResponse.setLectureId(1);

        //when 이거를 실행했을 떄
        ReserveRequest findOne = reserveService.findOne(reserveResponse.getUserId());
        findOne.setUserId(1);
        findOne.setLectureId(1);

        // Mock 동작 설정
        when(reserveService.insertReservation(reserveResponse)).thenReturn(findOne);

        ReserveRequest result = reserveService.insertReservation(reserveResponse);

        //then 결과가 이게 나와야 돼
        if(findOne != null){
            System.out.println("findOne : " + reserveResponse.getLectureId());
        }
        assertThat(reserveResponse.getLectureId()).isEqualTo(1);
        assertThat(result.getLectureId()).isEqualTo(1);

    }

    @Test
    void 예약수정() {
        //given 뭔가가 주어졌는데
        ReserveCommand reserveCommand = new ReserveCommand();
        reserveCommand.setLectureId(1);
        reserveCommand.setId(1);
        reserveCommand.setId(1);

        //when 이거를 실행했을 때
        when(reserveService.modifyReservation(reserveCommand.getUserId())).thenReturn(reserveCommand);

        ReserveRequest findOne = reserveService.findOne(reserveCommand.getUserId());
        //then 결과가 이게 나와야 돼
        assertThat(findOne).isNotNull();
        if(findOne != null){
            System.out.println("findOne : " + reserveResponse.getLectureId());
        }
    }

    @Test
    void 예약삭제() {
        //given 뭔가가 주어졌는데
        ReserveResponse reserveResponse = new ReserveResponse();
        reserveResponse.setId(1);
        reserveResponse.setUserId(1);

        reserveService.deleteReservation(reserveResponse.getId());

        //when 이거를 실행했을 때
        List<ReserveInfo> list = reserveService.findReservation(reserveResponse.getUserId());

        //then 결과가 이게 나와야 돼

        if(list.isEmpty()){
            System.out.println("삭제 완료");
        }
        assertThat(list.size()).isEqualTo(0);
    }

}

답변 2

0

안녕하세요. sh hyeogi365님, 공식 서포터즈 OMG입니다.

어떤 exception이 발생하는지 확인해보시고, 해당 exception 처리에 대한 해결방안을 확인해보시면 좋을 것 같아요.

인텔리제이 console에서 검색 기능으로 exception을 키워드로 검색해서 확인해보시면 됩니다.

감사합니다.

0

안녕하세요, 인프런 AI 인턴입니다.

sh hyeogi365님, 통합 테스트 중 “Conditions Evaluation Report” 오류 메시지가 발생하는 경우에는 여러 가지 원인이 있을 수 있습니다. 이 문제를 해결하기 위해서는 몇 가지 중요한 사항들을 확인해볼 필요가 있습니다.

  1. 프로파일 설정: 스프링 부트 테스트에서 사용하는 프로파일이 잘못 설정됐을 수 있습니다. 올바른 application.yml이나 application.properties 내의 설정을 확인해 보세요. 테스트 환경에서는 특별히 application-test.yml을 사용하는 경우가 많으니 확인해보세요.

  2. Bean 정의 확인: 테스트 실행 시 필요한 Bean이 누락되었을 수 있습니다. 예를 들어 ReserveService가 제대로 스프링 컨텍스트에 로드되고 있는지 확인이 필요합니다. @MockBean이나 실제 구현체가 주입되는지 확인해 보시기 바랍니다.

  3. 의존성 문제: build.gradle에서 필요한 모든 의존성이 잘 포함되어 있는지 확인하세요. 특히 데이터베이스 연결을 위한 드라이버 및 JPA 관련 의존성이 누락되지 않았는지 점검해야 합니다.

  4. Mock 설정: when(reserveService.findReservation(1))와 같은 Mock 설정이 올바르게 작동하고 있는지 확인합니다. 필요하다면 MockitoAnnotations.openMocks(this)와 같은 방식으로 Mock을 초기화해보세요.

  5. 환경 설정: @SpringBootTest를 사용하고 있는 경우, 통합 테스트로 실제 애플리케이션 컨텍스트에 의존하기 때문에, 종속된 환경 설정이 필요합니다. 즉, 해당 configuration들이 올바르게 세팅되어 있어야 합니다.

문제의 더 구체적인 부분을 해결하려면 위의 요소들을 중심으로 로그 메시지를 분석하고 환경 설정을 확인하여 종합적인 접근을 시도하는 것이 좋습니다. 추가로 확인이 필요하거나 코드상의 다른 의문점이 있으면 언제든지 말씀해 주세요.

문제 해결에 도움이 되셨길 바랍니다!

IDE 환경 이미지 참고
기본 설정 링크

sh hyeogi365님의 프로필 이미지
sh hyeogi365

작성한 질문수

질문하기