• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

(해결완료) MockMvc를 이용한 테스트가 안됩니다.

23.06.18 17:46 작성 23.06.19 16:07 수정 조회수 351

0

※※※※※ 해결완료 ※※※※※

mvc.perform()의 get이나 post 같은 매서드 타입을

스태틱임포트 해야하는데

이 때 선택지가 3개 있습니다.

이 중 MockMvcRequestBuilders의 post()를

임포트 하니까 해결이 됐습니다.

RequestBuilder로 캐스팅을 해주지 않아도 되구요

그리고, 이래저래 해보면서 MockMvc 말고도

MockMvcBuilder 객체를 이용해서

build().perform()으로 시작해 똑같이 코드를

작성하면 테스트가 정상적으로 실행됩니다!

※※※※※ 해결완료 ※※※※※


SecurityConfig 테스트 강의에도 질문을 드렸는데..
답이 없길래 그냥 넘어갔는데 여기서도 쓰여
다시 질문드립니다.

MockMvc를 이용해서 테스트를 진행할 때,

@Test
@DisplayName("회원가입 테스트")
void join_test() throws Exception {
    // given
    JoinRequestDto joinRequestDto = JoinRequestDto.builder()
                                            .username("minsu")
                                            .password("1234")
                                            .email("minsu@gmail.com")
                                            .fullname("김민수")
                                            .build();

    String requestBody = objectMapper.writeValueAsString(joinRequestDto);
    System.out.println("requestBody = " + requestBody);

    // when
    ResultActions resultActions = mvc.perform((RequestBuilder) post("/api/join").content(requestBody).contentType(MediaType.APPLICATION_JSON));

    // then
    
}

위 부분에서 문제가 생기는 부분은 아래 코드인데요

// when
ResultActions resultActions = mvc.perform((RequestBuilder) post("/api/join").content(requestBody).contentType(MediaType.APPLICATION_JSON));
  1. 먼저 content를 설정할 수 있는 api?가 없고요.

  2. 해당 구문을 RequestBuilder로 캐스팅해야
    빨간줄이 사라집니다. 그러니까 perform()이 파라미터로 RequestBuilder를 받게 돼있습니다.

gradle은 아래와 같습니다.

plugins {
   id 'java'
   id 'org.springframework.boot' version '2.7.12'
   id 'io.spring.dependency-management' version '1.0.15.RELEASE'
}

group = 'io.com'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
	implementation 'org.springframework.boot:spring-boot-starter-security'
	implementation 'org.springframework.boot:spring-boot-starter-validation'
	implementation 'org.springframework.boot:spring-boot-starter-web'
	implementation 'com.auth0:java-jwt:4.2.1'
	compileOnly 'org.projectlombok:lombok'
	developmentOnly 'org.springframework.boot:spring-boot-devtools'
	runtimeOnly 'com.h2database:h2'
	runtimeOnly 'com.mysql:mysql-connector-j'
	annotationProcessor 'org.projectlombok:lombok'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	testImplementation 'org.springframework.security:spring-security-test'
}

 

그리고 테스트쪽 라이브러리는 아래와 같습니다.

Gradle: org.junit.jupiter:junit-jupiter:5.8.2

Gradle: org.junit.jupiter:junit-jupiter-api:5.8.2

Gradle: org.junit.jupiter:junit-jupiter-engine:5.8.2

Gradle: org.junit.jupiter:junit-jupiter-params:5.8.2

Gradle: org.junit.platform:junit-platform-commons:1.8.2

Gradle: org.junit.platform:junit-platform-engine:1.8.2

Gradle: org.mockito:mockito-core:4.5.1

Gradle: org.mockito:mockito-junit-jupiter:4.5.1

 

답변 2

·

답변을 작성해보세요.

0

import 문제입니다!!

0

taehun kim님의 프로필

taehun kim

2023.06.20

해당 코드는 사실 실행에는 문제가 없으나 캐스팅이 필요한 것 때문에 말씀하시는 것 같습니다.
다만 올려주신 코드만으로는 확인할 수 없습니다. 해당 테스트 메소드에 문제가 발생한 것이 아닌,
테스트 클래스 설정의 문제이거나 잘못된 import문을 작성한 것으로 예상됩니다.

정확히 문제가 발생한 부분은
mvc.perform() 코드에서
perform(post()), perform(get()) 등
매서드 타입을 정하는 부분이었습니다.

즉, post()나 get()은 스태틱 임포트 매서든데
인텔리제이에선 선택지가 3개로 나옵니다.
그 중 MockMvcRequestBuilders가 제공하는
post()나 get()을 사용해야 하는데
다른 클래스가 제공하는 매서드를 임포트해
생긴 문제였습니다.
그래서 캐스팅이 요구되었던 것이구요

해결은 되었지만 친절한 답변 감사드립니다.