만약 ... 봄 부팅에 mockito 시험에서 else 문 문제

HungryBird :

방법 또한 예외 테스트를 포함 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);
    }
}
davidxxx :

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로 전환하는 것을 고려해야한다.

추천

출처http://43.154.161.224:23101/article/api/json?id=191213&siteId=1