Par exemple, j'ai cette méthode dans UserService:
@Override
@Transactional
public UserDto create(UserDto userDto) {
User dbUser = userRepository.findOne(userDto.getId());
if (dbUser != null) {
throw new AuthException(AuthException.ErrorCode.DUPLICATE_USER_EXCEPTION);
}
User oneByLogin = userRepository.findOneByLogin(userDto.getLogin());
if (oneByLogin != null) {
throw new AuthExceptionAuthException.ErrorCode.DUPLICATE_LOGIN_EXCEPTION);
}
User newUser = new User();
newUser.setGuid(UUID.randomUUID().toString());
newUser.setInsertDate(new Date());
newUser.setFirstName(userDto.getFirstName());
newUser.setLastName(userDto.getLastName());
newUser.setLogin(userDto.getLogin());
newUser.setPassword(userDto.getPassword());
newUser.setAuthToken(TokenGenerator.nextToken());
newUser.setAuthTokenCreatedDate(new Date());
User savedUser = userRepository.save(newUser);
userDto.setAuthToken(savedUser.getAuthToken());
log.info("User {0} created", savedUser.getLogin());
return userDto;
}
Comment créer un test unitaire pour cette méthode? J'ai essayé ensuite:
@Test
public void createUser() {
UserDto userDtoRequest = new UserDto();
userDtoRequest.setLogin("Alex");
userDtoRequest.setPassword("123");
UserDto found = userService.create(userDtoRequest);
assertThat(found.getAuthToken()).isNotEmpty();
}
J'ai la prochaine logique:
User dbUser = userRepository.findOne(userDto.getId());
dbUser = NULLif (dbUser != null
) et if (oneByLogin != null)
ignorerUser savedUser = userRepository.save(newUser);
savedUser = NULLSur cette étape, j'ai un problème car je ne peux pas me moquer de userRepository.save(newUser)
.
newUser create inside the method. and test fail.
savedUser.getAuthToken () - savedUser == NULL
Je peux réécrire:
userRepository.save(newUser);
userDto.setAuthToken(newUser.getAuthToken());
log.info("User {0} created", newUser.getLogin());
return userDto;
mais que se passe-t-il si je veux utiliser l'objet retourné savedUser
?
Vous pouvez faire ce qui suit:
@RunWith(MockitoJUnitRunner.class)
public class SimpleTest {
@Mock
private UserRepository mockedUserRepository;
// .. your test setup
@Test
public void testYourMethod() {
User userToReturnFromRepository = new User();
userToReturnFromRepository.setAuthToken(YOUR_TOKEN);
when(mockedUserRepository.save(any(UserDto.class)).thenReturn(userToReturnFromRepository);
UserDto found = userService.create(userDtoRequest);
// ... your asserts
}
}
avec cette approche, vous devez simplement vous assurer que votre mockedUserRepository
est injecté dans votre classe sous test (par exemple, dans le constructeur).
Vous devez écrire plusieurs scénarios de test afin de tester différents scénarios.
Scénario 1: lorsque findOne retourne un objet non null:
@Test(expected=AuthException.class)
public void testCreateUserWhenAvailable() {
//Create one sample userDto object with test data
when(mockedUserRepository.findOne(userDto.getId())).thenReturn(new User());
userService.create(userDto);
}
Scénario 2: lorsque findOneByLogin renvoie un objet null:
@Test(expected=AuthException.class)
public void testCreateUserWhenLoginAvailable() {
//Create one sample userDto object with test data
when(mockedUserRepository.findOne(userDto.getId())).thenReturn(null);
when(mockedUserRepository.findOneByLogin(userDto.getId())).thenReturn(new User());
userService.create(userDto);
}
Scénario 2: quand save est terminé:
@Tester
public void testCreateUserWhenSaved() {
//Create one sample userDto object with test data
when(mockedUserRepository.findOne(userDto.getId())).thenReturn(null);
when(mockedUserRepository.findOneByLogin(userDto.getId())).thenReturn(null);
//Create sample User object and set all the properties
User newUser=new User();
when(mockedUserRepository.save(Mockito.any(User.class)).thenReturn(newUser);
User returnedUser=userService.create(userDto);
//You have two ways to test, you can either verify that save method was invoked by
//verify method
verify(mockedUserRepository, times(1)).save(Mockito.any(User.class);
//or by assertion statements, match the authToken in the returned object to be equal
//to the one set by you in the mocked object
Assert.assertEquals(returnedUser.getAuthToken(),newUser.getAuthToken());
}