如何为if ... else语句编写一个模拟测试用例,其中还包括异常测试,对此我感到很困惑。 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);
}
}
答案 0 :(得分:3)
1)您编写的是单元测试,而不是切片测试或集成测试。因此,这里的Spring Boot无关紧要,因为您不需要加载容器来测试组件的逻辑。
如果您有兴趣,可以阅读my question/answer about this field。
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 5库而不是您似乎根据使用的运行器使用的JUnit 4库编写断言的。
您应该考虑切换到JUnit 5进行新测试。