Skip to content

Instantly share code, notes, and snippets.

@singun
Created April 8, 2019 22:45
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save singun/590dded3ba054b81f4c92130104b8059 to your computer and use it in GitHub Desktop.
Save singun/590dded3ba054b81f4c92130104b8059 to your computer and use it in GitHub Desktop.
ArgumentCaptor
public String processFindForm(Owner owner, BindingResult result, Model model){
// allow parameterless GET request for /owners to return all records
if (owner.getLastName() == null) {
owner.setLastName(""); // empty string signifies broadest possible search
}
// find owners by last name
List<Owner> results = ownerService.findAllByLastNameLike("%"+ owner.getLastName() + "%");
if (results.isEmpty()) {
// no owners found
result.rejectValue("lastName", "notFound", "not found");
return "owners/findOwners";
} else if (results.size() == 1) {
// 1 owner found
owner = results.get(0);
return "redirect:/owners/" + owner.getId();
} else {
// multiple owners found
model.addAttribute("selections", results);
return "owners/ownersList";
}
}
@Test
void testProcessFindForm() {
// given
Owner owner = new Owner(1l, "Shin", "Daewook");
List<Owner> owners = new ArrayList<>();
final ArgumentCaptor<String> captor = ArgumentCaptor.forClass(String.class);
given(ownerService.findAllByLastNameLike(captor.capture())).willReturn(owners);
// when
String result = ownerController.processFindForm(owner, bindingResult, null);
// then
assertThat("%Daewook%").isEqualToIgnoringCase(captor.getValue());
}
@Captor
ArgumentCaptor<String> stringArgumentCaptor;
@Test
void testProcessFindFormAnnotation() {
// given
Owner owner = new Owner(1l, "Shin", "Daewook");
List<Owner> owners = new ArrayList<>();
final ArgumentCaptor<String> captor = ArgumentCaptor.forClass(String.class);
given(ownerService.findAllByLastNameLike(stringArgumentCaptor.capture())).willReturn(owners);
// when
String result = ownerController.processFindForm(owner, bindingResult, null);
// then
assertThat("%Daewook%").isEqualToIgnoringCase(stringArgumentCaptor.getValue());
}
@singun
Copy link
Author

singun commented Apr 8, 2019

ArgumentCaptor을 사용하여 특정 메소드에 사용되는 아규먼트를 capture(저장) 해놓았다가 나중에 다시 사용(getValue)할 수 있다. 아큐먼트의 값(혹은 객체) 에 대해서도 테스트를 진행하기 위해 사용한다.

@singun
Copy link
Author

singun commented Apr 8, 2019

Argument Matcher와 다른 점은 따로 클래스를 만들 필요가 없다는 점, 그리고 verification에만 사용할 수 있다는 점이다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment