Tworzenie obiektu do testów

0

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

  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:

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:

  @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:

@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:

    @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

0

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

0

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

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:

 @Test
    void whenUserExist_DeleteUser() {
    }

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

 @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:

 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:

@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()));
    }
}
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

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

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1