【发布时间】:2018-07-09 10:10:06
【问题描述】:
我有服务:
@Slf4j
@Service
public class CashierServiceDefault implements CashierService {
private final UserRepository userRepository;
@Autowired
public CashierServiceDefault(UserRepository userRepository) {
this.userRepository = userRepository;
}
@Override
@Transactional
public CashierDto login(CashierDto cashier) {
User dbUser = userRepository.findOneByLoginAndPassword(cashier.getLogin(), cashier.getPassword());
validateCashier(cashier.getLogin(), dbUser);
User userWithToken = createAuthToken(dbUser);
return domainUserToCashierDto(userWithToken, cashier);
}
private void validateCashier(String login, User dbUser) {
if (dbUser == null) {
log.error("Cashier: {} not found", login);
throw new AuthException(AuthException.ErrorCode.USER_NOT_FOUND_EXCEPTION);
}
UserRole userRole = UserRole.valueOf(dbUser.getUserRole().getCode());
if (userRole != UserRole.CASHIER) {
log.error("User: {} has role: {}. expected: CASHIER ", login, userRole.toString());
throw new AuthException(AuthException.ErrorCode.USER_ROLE_NOT_PERMISSION_EXCEPTION);
}
}
private User createAuthToken(User user) {
user.setAuthToken(TokenGenerator.nextToken());
user.setAuthTokenCreatedDate(new Date());
return userRepository.save(user);
}
private CashierDto domainUserToCashierDto(User user, CashierDto cashier) {
//mapping user's fields to CashierDto,s fields
return cashier;
}
我想为此服务创建测试。我试过这个:
@RunWith(SpringRunner.class)
public class CashierServiceDefaultTest {
@MockBean
private UserRepository userRepository;
private CashierService cashierService;
@Before
public void setUp() throws Exception {
cashierService = new CashierServiceDefault(userRepository);
}
@Test
public void login() {
CashierDto cashierDto = new CashierDto();
cashierDto.setLogin("Alex");
cashierDto.setPassword("123");
User user = new User();
user.setLogin("Alex");
user.setPassword("123");
//and other test values
when(userRepository.findOneByLoginAndPassword(cashierDto.getLogin(), cashierDto.getPassword())).thenReturn(user);
CashierDto found = cashierService.login(cashierDto);
assertThat(found.getAuthToken()).isEqualTo("123");
}
我有问题:
1.如何在我的服务中测试private 方法?我需要测试它们吗?如果有,怎么做?
2。我应该如何测试公共登录方法?我为存储库方法制作了一个存根:
when(userRepository.findOneByLoginAndPassword(cashierDto.getLogin(), cashierDto.getPassword())).thenReturn(user);
但是我应该为内部服务方法做存根吗?(validateCashier、createAuthToken、domainUserToCashierDto)。如果有,怎么做?
【问题讨论】:
-
你不应该模拟/测试私有方法。但是,您可以通过您的公共方法测试私有方法。在 validateCashier 方法中,您可以控制用户对象,只需在测试方法上使用
@Test(expected=AuthException.class)或使用@Rule public final ExpectedException exception = ExpectedException.none();存根 userRepository 返回 null 并期望 AuthException 请查看 link 了解更多详细信息
标签: java spring unit-testing mocking mockito