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

꿀잼사슴님의 프로필 이미지
꿀잼사슴

작성한 질문수

스프링 웹 MVC

핸들러 메소드 7부 폼 서브밋 에러 처리

2:51초 질문입니다.

해결된 질문

작성

·

222

·

수정됨

0

SampleController 클래스에 @Validated 어노테이션을 추가하였고, Event 클래스에서 name에 @NotBlank와 limit에 @Min(value = 0)을 추가하였습니다. 코드는 다음과 같습니다.

Event.class

package com.springMvc.N04_handlerMethod;

import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;

public class Event {
    private Integer id;
    @NotBlank
    private String name;
    @Min(value = 0)
    private Integer limit;

    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getLimit() {
        return limit;
    }
    public void setLimit(Integer limit) {
        this.limit = limit;
    }
}

 

SampleController.class

package com.springMvc.N04_handlerMethod;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;

@Controller
public class SampleController {

    @GetMapping("/events/{id}")
    @ResponseBody
    public Event getEvent1(@PathVariable Integer id){
        Event event=new Event();
        event.setId(id);
        return event;
    }

    @GetMapping("/events/form")
    public String eventsForm(Model model){
        Event newEvent=new Event();
        newEvent.setName("action");
        newEvent.setLimit(30);
        model.addAttribute("event", new Event());
        return "/events/form";
    }

    @PostMapping("/events")
    public String getEvent(@Validated @ModelAttribute Event event,
                            BindingResult bindingResult) {
        if (bindingResult.hasErrors()) {
            return "/events/form";
        }
        return "/events/list";
    }
}

SampleControllerTest.class

package com.springMvc.N04_handlerMethod;

import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;

import static org.junit.jupiter.api.Assertions.*;
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.*;

@RunWith(SpringRunner.class)
@WebMvcTest
class SampleControllerTest {

    @Autowired
    MockMvc mockMvc;

    @Test
    public void postEvent() throws Exception {
        mockMvc.perform(post("/events")
                        .param("name", "krille")
                        .param("limit", "-1"))
                .andDo(print())
                .andExpect(status().isOk())
                .andExpect(model().hasErrors());
    }

}

Event.class에서 설정한 validation과 SampleController.class의 getEvent() 메소드의 @Validated, BingingResult에 따르면 test에서 입력된 param값에 따라 limit가 음수로 나오면 model().hasError()로 인해 테스트가 통과가 되어야 할텐데

java.lang.AssertionError: Expected binding/validation errors

가 나오면서 계속 테스트가 통과되지 않습니다. 오류를 해결하기 위해 구글링, chatGPT를 검색해보았지만 결국 해결하지 못해 이렇게 질문하였습니다.

사용한 스프링 프레임워크 부트는 3.1.2 버전입니다.

추가로 지금까지 수업을 들으며 다른 질문도 하려고 합니다.
1. Test 작성시 mockMvc.perform()을 사용할 때 마다 자동으로 import를 하고 싶은데 어떤 키를 눌러야 하나요?
2. junit이 start.spring.io에서 제공하지 않나요? @RunWith(SpringRunner.class) 어노테이션을 작성할 때마다 수동으로 junit 의존성을 추가합니다.
3. 개인적인 질문인데 코딩을 하다가 계속 막히면 화가 너무나서 감정 컨트롤이 너무 힘든데 강사님은 어떻게 감정을 다스리는지 궁금합니다.

 

답변 1

0

백기선님의 프로필 이미지
백기선
지식공유자

답변이 늦어서 죄송합니다. 문제가 재현되고 있는 프로젝트를 깃헙에 올려서 공유해 주시면 살펴보겠습니다.

붙여 넣어주신 코드를 봐서는 뭔가 이상해 보이는데 제가 직접 돌려볼 수 있는 코드 없이는 문제를 파악하긴 어렵네요.

  1. 단축키는 설정에 따라 다 다르지만 저는 Alt+엔터를 쓰거나 Cmd+. 사용해서 추가합니다.

  2. 질문이 잘 이해가 되지 않네요. 의존성을 추가한다는 것은 메이븐이나 그래들 설정 파일에 추가하는 것이고, @RunWith(SpringRunner) 코드를 작성할 때는 import 문을 추가해야 하는것인데 혹시 코드에 import 문을 추가하는 것을 "수동으로 junit 의존성을 추가합니다" 라고 말씀하신건가요?

  3. 글쎼요. 저는 화가나기 보다는 문제 해결하는 과정에서 재미를 느끼는 편입니다.

꿀잼사슴님의 프로필 이미지
꿀잼사슴
질문자

항상 좋은 강의 제공해주셔서 감사합니다.

문제가 된 코드를 20일에 자체적으로 해결을 했습니다. Event클래스에서 javax.validation 대신 jakarta.validation으로 import한 후 다시 실행해보니 테스트가 통과가 되었습니다. 테스트를 할 때 resource에서 event 디렉토리에 list.html을 테스트 하기 전에 생성했습니다.

2. @RunWith(SpringRunner) 코드를 작성할 때 macOS에서 control+엔터를 눌러서 import를 자동으로 하고 싶었는데 인텔리제이 community를 사용해서 그런지(추측입니다만) 자동으로 import를 못하여서 junit 의존성을 maven에 chatGPT를 통해서 직접 입력하였습니다.
인텔리제이 untimate 버전이 아니라서 start.spring.io를 사용했는데 add dependecies에서 junit을 검색해보니 아무런 결과가 없어서 질문하였습니다.

백기선님의 프로필 이미지
백기선
지식공유자

JUnit은 스프링 부트 프로젝트에 기본으로 들어가 있을텐데 이상한 일이네요.

꿀잼사슴님의 프로필 이미지
꿀잼사슴

작성한 질문수

질문하기