Hibernate Junit5 Testen der Repository-Methode

ve987

Aktives Mitglied
Hallo zusammen,

ich bin neu im Thema Junit5/ Spring Boot. Ich möchte gerne meine repository Methode testen.
Meine Test Methode: shouldThrowExceptionWhenNameNotExists() wirft aber keine Exception.
Könnt ihr mir bitte dabei helfen?

Vielen Dank im Voraus :)


Java:
@Repository
public interface EmployeeRepository extends JpaRepository<Employee, Long> {
    
    Employee findByName(String name);
}


Java:
@Service
public class EmployeeManager {

public Employee findByName(String name) throws Exception{
    if (employeeRepository.findByName(name) == null) {
        throw new Exception("employee does not exist");
    }
    return employeeRepository.findByName(name);
}

Java:
@DataJpaTest
@Rollback(false)
public class EmployeeRepositoryTest {

    @Autowired
    EmployeeRepository employeeRepository;

    @Test
    void shouldReturnEmployeeByName() {

        Employee employee = new Employee();
        employee.setName("max");
        employeeRepository.save(employee);

        Employee expectedEmployee = employeeRepository.findByName(employee.getName());

        assertThat(expectedEmployee.getName()).isEqualTo(employee.getName());
    }

    @Test
    void shouldThrowExceptionWhenNameNotExists() {

        Employee employee = new Employee();
        employee.setName("max");
        employeeRepository.save(employee);
            
        assertThrows(Exception.class, ()-> employeeRepository.findByName("jan"));

    }
 

LimDul

Top Contributor
Warum soll die eine Exception werfen? Dein Manager wirft die Exception, dein Repository logischerweise nicht, das setzt ein Select auf die Datenbank ab und liefert null, wenn es keinen findet.
 

ve987

Aktives Mitglied
LimDul danke! Du hast natürlich Recht :oops::oops:

Ok aber wenn ich den Code bearbeite und jetzt teste ich den Manager, wird immer noch keine Exception geworfen:

Java:
@Repository
public interface EmployeeRepository extends JpaRepository<Employee, Long> {
    
    Employee findByName(String name);
}


Manager:
Java:
    public Employee findByName(String name) {
        
        if (employeeRepository.findByName(name)== null) { 
            throw new NoSuchElementException("not found");}
                    
        return employeeRepository.findByName(name);
    }

Manager Test:

Java:
@ExtendWith(MockitoExtension.class)
class EmployeeManagerTest {

    @Mock
    private EmployeeRepository employeeRepository;

    @InjectMocks
    private EmployeeManager employeeManager;

        @Test
    void shouldReturnEmployeeByName()  {

        Employee employee = new Employee();
        employee.setName("max");
        
        when(employeeRepository.findByName(employee.getName())).thenReturn(employee);

        Employee expectedEmployee = employeeManager.findByName(employee.getName());

         assertThat(expectedEmployee.getName()).isEqualTo(employee.getName());
    }

    @Test
    void shouldThrowExceptionWhenNameNotExists() {

        Employee employee = new Employee();
        employee.setName("max");
        employeeRepository.save(employee);

        when(employeeRepository.findByName(any())).thenReturn(employee);
        
        assertThrows(NoSuchElementException.class, ()-> employeeManager.findByName("jan"));
    }
 

LimDul

Top Contributor
Ist ja auch korrekt.
Es kommt ja nicht null zurück.

Code:
        when(employeeRepository.findByName(any())).thenReturn(employee);
Du sagst, egal wie mein Repo aufgerufen wird - liefere employee zurück.
 

ve987

Aktives Mitglied
Du rettest meinen Tag :D

jetzt verstehe ich alles viel besser! Danke dir

So jetzt habe ich die Zeile abgeändert und jetzt ist der Test bestanden. Aber macht das jetzt Sinn? Entschuldigung fürs Nachfragen.

Java:
when(employeeRepository.findByName(any())).thenReturn(null);
 

LimDul

Top Contributor
Ja. Das ist schon sinnvoll und der Sinn von Unit-Tests.

Du hast zwei Tests:

a) Test, das das Repository korrekt funktioniert
Der nutzt ein echtes, Autowired Repository. Hier testest du, dass die Korrekten Ergebnisse kommen.

b) Test, dass der Manager funktioniert
Hier nutzt du ein Mocked-Repository. Damit hast du Kontrolle, was da als Ergebnis kommt um zu testen, ob sich dein Manager korrekt verhält.

So stellst du sicher, dass jeder Test genau eine Eigenschaft testet.
 
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben