방법 또한 예외 테스트를 포함 else 문, 나는 꽤 이것에 대해 혼란 스러워요 경우 ...에 대한 mockito 테스트 케이스를 작성하는 방법. UserService는 인터페이스입니다
UserFactory.java
public class UserFactory {
@Autowired
private List<UserService> UserList;
private final Map<String, UserService> UserMap = new HashMap<>();
@PostConstruct
public void initUserMap() {
for (final UserService user : UserList) {
UserMap.put(user.getUserId(), user);
}
}
public UserService getUser(String userId) {
final UserService userService = UserMap.get(userlId);
if (null == userService) {
throw new IllegalArgumentException("user are not in the group");
}
return userService;
}
}
UserService (인터페이스)
public interface UserService{
String getUserName();
String getUserId();
}
여기 내 테스트이지만, 그것은 정확하지 않습니다 ...
@RunWith(MockitoJUnitRunner.class)
public class UserServiceTest {
@Mock
private UserService userService;
@InjectMocks
private UserFactory UserFactory;
private Map<String, User> UserMap;
private String userId = "123";
@Before
public void set_up(){
UserMap = new HashMap<>();
UserMap.put(userId, userService);
}
@Test
public void getUser(){
when(UserMap.get(userId)).thenReturn(userService);
userService actual = userServiceFactory.getUser(userId);
assertEquals(UserMap.get(userId), actual);
}
}
1) 당신은 단위 테스트가 아닌 슬라이스 테스트 또는 통합 테스트를 작성. 당신이 당신의 구성 요소의 논리를 테스트 할 수있는 용기를로드 할 필요가 없습니다 그래서 여기에 봄 부팅 문제가되지 않습니다.
당신이 읽을 수있는 이 분야에 대한 내 질문 / 대답을 당신이에 관심이 있다면.
2) 분기 ( if/else
여러 시나리오를 가지고 있다는 논리 수단에서).
고유 시나리오는 일반적으로 별개의 시험 방법과 의미있는 이름을 의미한다.
또한시 / 다음 관용구 / 주어진에 의존 할 수 있습니다.
3) 시험 때문에 지점에 대한 입력 정보는 각 시험 방법의 모의에 대해서는 다른 행동을 등록 할 것입니다, 그것은 또한 수단 모의에 의해 제공됩니다.
4) UserService
조롱 할 필요가 없습니다. 그것은 모의하지 모의 자체에 의해 반환 된 값이어야한다. 여기에서 조롱해야한다 Map
.
5) 테스트 UserFactory
, 당신은 그래서 이름을 지정합니다 UserFactoryTest
.
예를 들면 :
@RunWith(MockitoJUnitRunner.class)
public class UserFactoryTest {
@Mock
private Map<String, User> UserMap;
@InjectMocks
private UserFactory UserFactory;
private String userId = "123";
@Test
public void getUser(){
when(UserMap.get(userId)).thenReturn(userService);
userService actual = userServiceFactory.getUser(userId);
assertEquals(UserMap.get(userId), actual);
}
@Test
public void getUser_with_unknown_userId(){
Assertions.assertThrows(IllegalArgumentException.class,
()-> userServiceFactory.getUser(userId));
}
}
당신은 두 번째 경우에 나는 모의에 대한 어떤 동작을 등록하지 않은 것을 알 수 있습니다.
기본적으로 Mockito는 반환 null
과 실제로 내가 예외를 자극 할 것입니다. 그래서 괜찮습니다.
난 당신이 사용 주자를 따라 사용하는 것하는 JUnit 4에서는 라이브러리를 JUnit을 5 라이브러리에 의존하지하여 주장을 쓴 유의하십시오.
당신은 새로운 테스트를 위해 JUnit을 5로 전환하는 것을 고려해야한다.