Wie zum Hohn JPA-repository speichern-Methode im unit-tests
Beispielsweise, ich habe diese Methode in 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;
}
Wie kann ich das erstellen von unit-Tests für diese Methode? Ich versuchte weiter:
@Test
public void createUser() {
UserDto userDtoRequest = new UserDto();
userDtoRequest.setLogin("Alex");
userDtoRequest.setPassword("123");
UserDto found = userService.create(userDtoRequest);
assertThat(found.getAuthToken()).isNotEmpty();
}
Ich habe neben logic:
- Test starten
User dbUser = userRepository.findOne(userDto.getId());
dbUser = NULLif (dbUser != null
) undif (oneByLogin != null)
überspringen- neuen Benutzer erstellen und festlegen von Daten
User savedUser = userRepository.save(newUser);
savedUser = NULL
Zu diesem Schritt, ich habe ein problem denn ich kann mich nicht verspotten userRepository.save(newUser)
.
newUser create inside the method. and test fail.
savedUser.getAuthToken() - savedUser == NULL
Kann ich umschreiben:
userRepository.save(newUser);
userDto.setAuthToken(newUser.getAuthToken());
log.info("User {0} created", newUser.getLogin());
return userDto;
aber was ist, wenn ich das zurückgegebene Objekt savedUser
?
- Sie testen Ihren service, so sollten Sie verspotten seine Abhängigkeiten wie das repository. Durch die Verspottung der Methode
save
können Sie das Objekt angeben, das es gibt. - grape_mao und wie mache ich es? wie rufe ich die Methode userRepository.save(newUser), wenn die newUser-Objekt erstellen im service-Methode und ich habe es nicht in meinem test. wenn(userService.speichern(???)).thenReturn(???);
- Wenn Sie nicht schreiben können testen Sie Ihre Methode, es ist ein Zeichen, dass Sie brauchen, um zu teilen Sie in mehrere Teile, und versuche Sie separat.
- Sie haben zwei Optionen. 1. Sie ignorieren das argument, übergeben, zurückgeben
User
mit einem token. 2. verwenden Sie so etwas wiedoAnswer
zu verspotten, die Methode, so dass Sie fangen kann, das argument. - Möglich, Duplikat der Nicht in der Lage zu verspotten, Spring-Data-JPA-repositories mit Mockito
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie Folgendes tun:
mit diesem Ansatz, Sie müssen nur sicherstellen, dass Ihre
mockedUserRepository
wird injiziert in Ihre Klasse unter test (z.B. im Konstruktor).Müssen Sie dies tun.
Und jetzt können Sie erhalten Benutzer, die übergeben Sie als argument.
Den Sie schreiben müssen, mehrere test-Fälle, um um verschiedene Szenarien zu testen.
Szenario 1: wenn findOne gibt einen nicht-null-Objekt:
Szenario 2: wenn findOneByLogin gibt ein null-Objekt:
Szenario 2: wenn speichern ist getan:
@Test