春ブーツで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=191215&siteId=1