문제

Test Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
@Test
void testCreateWordFail() throws Exception {
// gvien
BindingResult bindingResult = new MapBindingResult(new HashMap(), "");
bindingResult.rejectValue("test", "test", "haha");

WordDTO.AddWord addWord = new WordDTO.AddWord();
addWord.setWord("test");
addWord.setMeaning("테스트");

given(this.service.getCreateWordBindingResult(addWord, bindingResult)).willReturn(bindingResult);

String addWordToJson = getAddWordToJson();

//when
ResultActions action = mockMvc.perform(post("/word/add")
.param("save", "")
.content(addWordToJson)
.contentType(MediaType.APPLICATION_JSON)
.with(csrf()))
.andDo(print());

//then
action.andExpect(status().isOk())
.andExpect(view().name("thymeleaf/word/createWordForm"));
}

위 코드처럼 this.service.getCreateWordBindingResult(addWord, bindingResult) method가 호출될 때 willdReturn으로 지정한 bindingResult가 return되게 하고 하려했으나 given이 제대로 동작하지 않아서 인지 getCreateWordBindingResult method 안에서 result가 존재하지 않아 NullPointerException이 발생하여 테스트가 실패했다.

Test Target

1
2
3
4
5
6
7
8
9
10
11
@PostMapping(value="/word/add", params= {"save"})
public String createWord(@Valid AddWord word, BindingResult bindingResult) {
BindingResult result = service.getCreateWordBindingResult(word, bindingResult);

if (result.hasErrors()) { // NullPointerException 발생
return "thymeleaf/word/createWordForm";
}

service.insertWord(word);
return "thymeleaf/index";
}

해결

ArgumentMatchers class에 any()를 이용해서 파라미터를 넘겼더니 정상적으로 동작했다.

1
given(this.service.getCreateWordBindingResult(any(WordDTO.AddWord.class), any(BindingResult.class))).willReturn(bindingResult);
  • p.s : 기본 자료형 (int, char)이나 String 등은 any()를 사용하지 않고 그대로 파라미터로 받아도 정상적으로 동작하는 것 같은데 어째서 따로 정의한 클래스만 인식(?) 하지 못해서 willReturn이 먹히지 않고 null이 return 되는지 알 수가 없었다.

전체 코드