Test jednostkowy dla metody zapisującej do bazy.

0

Witam,
Jak powinien wyglądać przykładowy test jednostkowy dla takiej metody.

	public boolean saveUser(User user) {
		try {
			if (!entityManager.getTransaction().isActive()) {
				entityManager.getTransaction().begin();
			}
			entityManager.persist(user);
			entityManager.getTransaction().commit();
			return true;
		} catch (Exception ex) {
			entityManager.getTransaction().rollback();
			return false;
		}
	} 
    @Test
    public void testSaveUser() throws Exception {

    }
 
1
  1. Powinieneś używać transakcji deklaratywnych tzn @Trasactional i wtedy nie musisz już testować otwierania, zamykania ani rollbacku... To już przetestowali developerzy tej implementacji JTA.
  2. W efekcie twoja metoda będzie robiła tylko persist() którego też nie musisz testować bo zrobili to za ciebie developerzy tego dostawcy JPA.

Niemniej jeśli MUSISZ mieć taki kod jaki masz to potrzebujesz 3 testy:

  1. Kiedy wszystko idzie ok i transakcja była zamknięta
  2. Kiedy wszystko idzie ok i transakcja była otwarta
  3. Kiedy poleci wyjątek

Musisz mockować entyty managera oraz transaction.
oczekiwania testu z zamkniętą transakcją:

  • transakcja zwraca false na sprawdzenie czy jest otwarta
  • transakcja zostaje otwarta
  • wywołane zostaje persist na entitymanagerze z podanym argumentem
  • transakcja zostaje commitowana
  • asercja czy wynikem metody jest true

oczekiwania testu z otwartą transakcją:

  • transakcja zwraca true na sprawdzenie czy jest otwarta
  • wywołane zostaje persist na entitymanagerze z podanym argumentem
  • transakcja zostaje commitowana
  • asercja czy wynikem metody jest true

oczekiwania testy z rzuconym wyjątkiem:

  • transakcje jak chcesz
  • rzucenie wyjątku z persist
  • transakcja zostaje wycofana
  • asercja czy wynikiem jest false

Oczywiście trochę upraszczam wrzucając wszystkie oczekiwania do jednego worka. W rzeczywistości worki są dwa:

  1. Konfigurowanie zachowania mocków żeby przejść wybraną ścieżką przez kod (np. ustalenie wartości zwracanej z jakiejś metody)
  2. Konfigurowanie oczekiwanych wywołań (np. metoda powinna otwrzyć transakcje i ją commitować)
0

Nie testuj tego jednostkowo, a integracyjnie. Jesli uzywasz JEE uzyj http://arquillian.org/, w przypadku Springa Spring Testing.

Szczerze mowiac, nie lepiej sie przeniesc na automatyczne zarzadzanie transkajami via Spring-TX albo JTA? Dlaczego recznie zarzadzasz transakcjami?

Jak koniecznie chcesz to testowac jednostkowo to musisz mockowac entityManager, ale szansa ze cos bedzie nie tak z konfiguracja jest bardzo duza i tylko test integracyjny moze tu wniesc sensowna odpowiedz czy kod jest prawidlowy (chyba, ze to cwiczenie akademickie).

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