Tworzenie obiektu do testów

Ornstein
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 121
0

Cześć,
tworzę obiekt User w klasie UserBuilder do testów, korzystając z metody:

Kopiuj
  public User build() {
        Role role = roleDAO.findByName(UserRole.ROLE_USER).orElseThrow(
                () -> new RoleNotFoundException("Role not found"));
        Set<Role> roles = Set.of(role);

        User user = new User();
        user.setId(id);
        user.setUsername(username);
        user.setEmail(email);
        user.setPassword(encoder.encode("Password#3"));
        user.setRoles(roles);

        return user;
    }

Następnie chcę ten obiekt zapisać w bazie danych. Czy powinienem zmodyfikować metodę build(), zmienić typ na void i dopisać zapis użytkownika?

Wyglądałoby to tak:

Kopiuj
public void build() {

         // tworzenie obiektu

        int userId = userDAO.save(user);
        user.getRoles().forEach(role -> userDAO.assignRoleToUser(userId, role.getId()));
    }

Tutaj mam pewne obawy, bo builder kojarzy mi się z tworzeniem obiektu, a nie też jego zapisywaniem.

Test:

Kopiuj
  @Test
    void whenUserExist_DeleteUser() {
        userBuilder.buildById(1).build();

        userService.deleteUserById(1);
        assertThat(userChecker.userExist(1)).isFalse();
    }

Czy zostawić metodę build(), która zwraca obiekt User, i dopisać jakąś osobną klasę do zapisu użytkownika. Coś w stylu:

Kopiuj
@Component
public class TestUserCreator {

    @Autowired
    private UserBuilder userBuilder;
    @Autowired
    private UserDAO userDAO;

    public void createById(Integer id) {
        User user = userBuilder.buildById(id).build();
        int userId = userDAO.save(user);
        user.getRoles().forEach(role -> userDAO.assignRoleToUser(userId, role.getId()));
    }
}

Test:

Kopiuj
    @Test
    void whenUserExist_DeleteUser() {
        userCreator.createById(1);
        
        userService.deleteUserById(1);
        
        assertThat(userChecker.userExist(1)).isFalse();
    }

Czy zastosować jeszcze jakieś inne rozwiązanie?

Dzięki za pomoc

JB
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Holandia
  • Postów: 853
0

Stwórz roboczy obszar widoku programisty w aplikacji, tam przekierowywuj każdy wynik działania. Klikasz i masz widzieć efekt.

Riddle
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10227
0

Nie rozumiem co w ogóle próbujesz zrobić.

Ornstein
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 121
0
Riddle napisał(a):

Nie rozumiem co w ogóle próbujesz zrobić.

Chcę przetestować funkcjonalność usuwania użytkownika. Test ma za zadanie sprawdzić, czy po usunięciu, użytkownik został pomyślnie usunięty z bazy danych.
To jest ten test, celowo pusty:

Kopiuj
 @Test
    void whenUserExist_DeleteUser() {
    }

Żeby mieć kogo usunąć, muszę stworzyć i zapisać użytkownika. Używam UserBuilder i tworzę użytkownika:

Kopiuj
 @Test
    void whenUserExist_DeleteUser() {
        User user = userBuilder.buildById(1).build();
    }

I teraz zastanawiam się, jak powinienem tego użytkownika zapisać.
Wydaje mi się, że bezpośrednie zapisanie użytkownika w teście nie jest najlepszym pomysłem:

Kopiuj
 int userId = userDAO.save(user);
 user.getRoles().forEach(role -> userDAO.assignRoleToUser(userId, role.getId()));

Myślałem o stworzeniu dodatkowej klasy, która połączy tworzenie i zapisanie użytkownika:

Kopiuj
@Component
public class TestUserCreator {

    @Autowired
    private UserBuilder userBuilder;
    @Autowired
    private UserDAO userDAO;

    public void createById(Integer id) {
        User user = userBuilder.buildById(id).build();
        int userId = userDAO.save(user);
        user.getRoles().forEach(role -> userDAO.assignRoleToUser(userId, role.getId()));
    }
}
Riddle
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10227
1
Ornstein napisał(a):

I teraz zastanawiam się, jak powinienem tego użytkownika zapisać.

Nie ma znaczenia, to szczegół implementacyjny.

Test powinien wyglądać tak

Kopiuj
existingUserWithName("Mark")
deleteUserByName("Mark")
assertUserDoesNotExist("Mark")

A to jak te metody są zaimplementowane nie ma najmniejszego znaczenia.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.