また、例外テストが含まれている場合... 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に切り替えることを検討すべきです。