Activitats

Modificar les dades d'un usuari

L’objectiu d’aquesta activitat és escriure un test que comprovi que el codi té la capacitat de modificar les dades d’un usuari correctament.

Com podeu veure a la classe UserServiceImpl, el mètode de l’especificació JPA que s’utilitza per modificar dades és merge. Aquesta és la documentació:

  1. /**
  2.   * Merge the state of the given entity into the
  3.   * current persistence context.
  4.   * @param entity entity instance
  5.   * @return the managed instance that the state was merged to
  6.   * @throws IllegalArgumentException if instance is not an
  7.   * entity or is a removed entity
  8.   * @throws TransactionRequiredException if there is no transaction when
  9.   * invoked on a container-managed entity manager of that is of type
  10.   * <code>PersistenceContextType.TRANSACTION
  • /

public <T> T merge(T entity); </code>

Com podeu veure, el mètode retorna l’objecte modificat. A partir del següent

codi ( 7.9 KB )
, modifiqueu el mètode edit de la interfície UserService, la seva implementació i afegiu el test editUser al test UserServiceTest, que comprovi que les dades es modifiquen correctament.

  1. public interface UserService {
  2. public void create(User user);
  3. public User edit(User user);
  4. public void remove(User user);
  5. public User findUserByUsername(String username);
  6. }
  1. @Stateless
  2. public class UserServiceImpl implements UserService {
  3. @PersistenceContext
  4. private EntityManager entityManager;
  5.  
  6. @Override
  7. public User edit(User user) {
  8. return entityManager.merge(user);
  9. }
  10. }

La resta del codi que no ha canviat no hi està inclòs.

Test a afegir a UserServiceTest.

  1. @Test
  2. public void editUser() {
  3. User user = new User();
  4. user.setActive(true);
  5. user.setCreatedOn(new Timestamp(new Date().getTime()));
  6. user.setEmail("user1@test.com");
  7. user.setName("John");
  8. user.setPassword("secret");
  9. user.setRank(100);
  10. user.setUsername("user1");
  11. userService.create(user);
  12.  
  13. Assert.assertNotNull(user.getUserId());
  14.  
  15. String newEmail = "user1@gmail-test.com";
  16. user.setEmail(newEmail);
  17.  
  18. User modifiedUser = userService.edit(user);
  19. Assert.assertEquals("user1@gmail-test.com", modifiedUser.getEmail());
  20. }

Eliminar un usuari

L’objectiu d’aquesta activitat és escriure un test que comprovi que el codi té la capacitat d’eliminar un usuari de la base de dades.

A partir del següent

codi ( 7.9 KB )
, afegiu el test removeUser al test UserServiceTest, que comprovi que un usuari s’esborra correctament.

Quan escriviu el codi us trobareu dos problemes. El primer és que quan s’intenti esborrar l’usuari hi haurà el següent error:

Caused by: java.lang.IllegalArgumentException: Entity must be managed to call remove: org.ioc.daw.user.User@59655457, try merging the detached and try the remove again.

Una pista: el problema és que per poder esborrar una entitat ha de ser part de la sessió, i això s’aconsegueix amb el mètode merge.

Un cop solucioneu això us trobareu un altre problema: en executar el test es llançarà una excepció:

Caused by: javax.persistence.NoResultException: getSingleResult() did not retrieve any entities.

Aquí teniu la documentació del mètode getSingleResult.

  /**
   * Execute a SELECT query that returns a single untyped result.
   * @return the result
   * @throws NoResultException if there is no result
   * @throws NonUniqueResultException if more than one result
   * @throws IllegalStateException if called for a Java
   *         Persistence query language UPDATE or DELETE statement
   * @throws QueryTimeoutException if the query execution exceeds
   *         the query timeout value set and only the statement is
   *         rolled back
   * @throws TransactionRequiredException if a lock mode other than
   *         <code>NONE</code > has been set and there is no transaction
   *         or the persistence context has not been joined to the transaction
   * @throws PessimisticLockException if pessimistic locking
   *         fails and the transaction is rolled back
   * @throws LockTimeoutException if pessimistic locking
   *         fails and only the statement is rolled back
   * @throws PersistenceException if the query execution exceeds 
   *         the query timeout value set and the transaction 
   *         is rolled back 
   */
  Object getSingleResult();

Modifiqueu el mètode findUserByUsername perquè retorni null si no troba cap resultat a la base de dades.

  1. @Stateless
  2. public class UserServiceImpl implements UserService {
  3.  
  4. @Override
  5. public void remove(User user) {
  6. user = entityManager.merge(user);
  7. entityManager.remove(user);
  8. }
  9.  
  10. @Override
  11. public User findUserByUsername(String username) {
  12. try{
  13. return (User) entityManager.createQuery("select object(o) from User o " +
  14. "where o.username = :username")
  15. .setParameter("username", username)
  16. .getSingleResult();
  17. } catch(NoResultException e){
  18. return null;
  19. }
  20. }
  21. }

La resta del codi que no ha canviat no hi està inclòs.

Test que comprova que un usuari s’esborra correctament.

  1. @Test
  2. public void removeUser() {
  3. User user = new User();
  4. user.setActive(true);
  5. user.setCreatedOn(new Timestamp(new Date().getTime()));
  6. user.setEmail("user2@test.com");
  7. user.setName("John");
  8. user.setPassword("secret");
  9. user.setRank(1);
  10. user.setUsername("user2");
  11. userService.create(user);
  12. Assert.assertNotNull(user.getUserId());
  13.  
  14. userService.remove(user);
  15.  
  16. User removedUser = userService.findUserByUsername("user1");
  17. Assert.assertNull(removedUser);
  18. }

Trobar els usuaris actius

L’objectiu d’aquesta activitat és escriure el codi i un test que permeti trobar els usuaris actius.

Modifiqueu UserService i UserServiceImpl i afegiu-hi un test.

  1. public interface UserService {
  2. public List<User> findActiveUsers();
  3. }
  1. @Stateless
  2. public class UserServiceImpl implements UserService {
  3. @Override
  4. public List<User> findActiveUsers() {
  5. try{
  6. return (List<User>) entityManager.createQuery("select object(o) from User o " +
  7. "where o.active= true")
  8. .getResultList();
  9. } catch(NoResultException e){
  10. return null;
  11. }
  12.  
  13. }
  14. }

I el test:

  1. @Test
  2. public void findActiveUsers() {
  3. String username = "jdoe";
  4. User user = new User();
  5. user.setActive(true);
  6. user.setCreatedOn(new Timestamp(new Date().getTime()));
  7. user.setEmail("test@test.com");
  8. user.setName("Jane");
  9. user.setPassword("password");
  10. user.setRank(100);
  11. user.setUsername(username);
  12. User user1 = new User();
  13. user1.setActive(false);
  14. user1.setCreatedOn(new Timestamp(new Date().getTime()));
  15. user1.setEmail("test1@test.com");
  16. user1.setName("Joe");
  17. user1.setPassword("password");
  18. user1.setRank(100);
  19. user1.setUsername("joeTest");
  20.  
  21. userService.create(user);
  22. userService.create(user1);
  23.  
  24. List<User> activeUsers= userService.findActiveUsers();
  25. Assert.assertNotNull(activeUsers);
  26. Assert.assertEquals(1, activeUsers.size());
  27. }

'Rank' d'un usuari

L’objectiu d’aquesta activitat és escriure el codi i un test que permeti trobar l’usuari amb el rank més gran.

Modifiqueu UserService i UserServiceImpl i afegiu-hi un test.

  1. public interface UserService {
  2. public User findUserWithHighestRank();
  3. }
  1. @Stateless
  2. public class UserServiceImpl implements UserService {
  3. @Override
  4. public User findUserWithHighestRank() {
  5. try {
  6. return (User) entityManager.createQuery("select object(o) from User o order by o.rank DESC")
  7. .setMaxResults(1)
  8. .getSingleResult();
  9. } catch (NoResultException e) {
  10. return null;
  11. }
  12. }
  13. }

I el test:

  1. @Test
  2. public void findUserWithHighestRank() {
  3. String username = "jdoe";
  4. User user = new User();
  5. user.setActive(true);
  6. user.setCreatedOn(new Timestamp(new Date().getTime()));
  7. user.setEmail("test@test.com");
  8. user.setName("Jane");
  9. user.setPassword("password");
  10. user.setRank(50);
  11. user.setUsername(username);
  12. User user1 = new User();
  13. user1.setActive(false);
  14. user1.setCreatedOn(new Timestamp(new Date().getTime()));
  15. user1.setEmail("test1@test.com");
  16. user1.setName("Joe");
  17. user1.setPassword("password");
  18. user1.setRank(100);
  19. user1.setUsername("joeTest");
  20.  
  21. userService.create(user);
  22. userService.create(user1);
  23.  
  24. User highestRankUser = userService.findUserWithHighestRank();
  25. Assert.assertEquals("joeTest", highestRankUser.getUsername());
  26. }

Anar a la pàgina següent:
Exercicis d'autoavaluació