ArgumentMatchers
ArgumentMatchers는 메소드 호출 시 특정 인자값과 일치하는지, 혹은 특정 조건을 만족하는지를 확인하는 데 사용되는 도구입니다. Mockito는 여러 가지 Argument Matchers를 제공하며, 사용자는 이를 활용하여 원하는 조건에 맞는 인자를 검증할 수 있습니다.
🏷️ ArgumentMatchers.any()
Mocking 된 메소드를 설정하기 위한 방법은 여러 가지가 있는데, 첫 번째는 메소드에 "고정된 값"을 사용합니다.
doReturn("...").when(userAccountService).getUserInfo("...");
위와 같이 doReturn()이나 do()에 사용된 문자열처럼 고정된 값을 사용할 수 있습니다.
하지만 모든 테스트가 고정된 값만 사용하지는 않습니다. 여러 상황에서 벌어질 수 있는 결과를 확인하는 것이 테스트의 주목적이기 때문에 다양한 범위의 값, 혹은 다양한 종류의 값을 사용해야 하는 경우가 많이 생깁니다.
이럴 때 사용할 수 있는 것이 바로 위에서 나온 any()입니다.
when(userAccountService.getUserInfo(any())).thenReturn(userAccountDto);
위의 코드는 any() 때문에 userAccountService.getUserInfo()에 어떤 값이 들어가도 똑같은 값을 반환하게 됩니다.
any() 외에도 anyString(), anyInt(), anyLong() 등 any()와 관련된 다양한 ArgumentMatchers가 존재합니다.
참고로 any()는 ArgumentMatchers에서 오버로딩 된 method입니다.
▪️ any() - 포함한 모든 것을 매칭(null 포함)
▪️ any(Class<T>) - null을 제외 한 모든 Class<T> 객체를 매칭
🏷️ ArgumentMatchers.eq()
Mockito는 mocking 된 메소드의 모든 인수가 ArguemntMatcher로 되어 있거나 고정 값이 되도록 강제하고 있습니다.
만약 mocking 된 메소드가 하나 이상의 argument를 갖고 있다면, 몇몇 인수만 선택하여 ArgumentMatchers를 사용하는 것은 불가능하고, 전부 ArgumentMatchers를 사용하거나 혹은 전부 고정값을 사용해야 합니다.
예를 들어서 아래와 같이 코드가 되어있습니다.
String email = "test@email.com";
String nickname = "nickname";
String memo = "memo";
when(userAccountService.modifiyUserInfo(any(), email, nickname, memo))
.thenReturn(mock(UserAccountDto.class));
userAccountService.modifiyUserInfo()의 any와 문자열 3개를 추가로 받아서 UserAccountDto를 반환한다라고 작성되어 있지만, 실행해 보면 InvalidUseOfMatchersException 이 생기는 것을 확인할 수 있습니다.
그럼 전부 다 any()를 쓰면 해결이 되나, 특정 인수를 고정값으로 넣어야 하는 상황이 생겼을 때, 사용하는 것이 eq()입니다.
when(userAccountService.modifiyUserInfo(any(), eq(email), eq(nickname), eq(memo)))
.thenReturn(mock(UserAccountDto.class));
위와 같이 eq를 넣어서 값을 처리하면 오류가 생기지 않고 정상적으로 작동하게 됩니다.
그 외에도, ArgumentMatchers를 사용할 때 주의해야 할 사항들이 있습니다.
▪️ ArguementMatchers를 반환 값으로 사용할 수 없다 - Stubbing에는 정확히 명시 된 값만 사용해야 합니다.
▪️ Verification이나 stubbing의 목적 외에는 ArguementMatchers 를 사용할 수 없습니다.
📖 Reference
'코딩 공부 > web & Java' 카테고리의 다른 글
[JPA] @PrePersist와 @PreUpdate (0) | 2024.10.18 |
---|---|
[JPA] @GeneratedValue의 GenerationType에 AUTO, IDENTITY 차이 (0) | 2024.10.17 |
[Spring / Redis] Spring에서 Redis 사용 (0) | 2024.10.10 |
[Spring / WebSocket] WebSocket와 STOMP (0) | 2024.10.05 |
[Spring / SSE] SSE(Server Sent Event) (1) | 2024.10.04 |