Testowanie metody restowej (mock)

0

Witam,
problem występuje podczas testowania metody delete.
Metoda w serwisie wygląda tak:

	public Optional<PersonDto> deletePerson(Long id) {
		Assert.notNull(id, "id can't be null");
		Optional<Person> personOptional = personRepository.findById(id);
		personRepository.delete(personOptional.orElse(new Person()));
		return personOptional.map(p -> modelMapper.map(p, PersonDto.class));
	}

A w testach wygląda następująco:

	@Test
	public void shouldDeletePersonById() {
		personService.deletePerson(1L);
		Mockito.verify(personRepository, times(1)).deleteById(1l);
	}

Niestety efekt jest następujący;

Wanted but not invoked:
personRepository.deleteById(1L);
-> at com.softwaremind.crew.people.service.PersonServiceTest.shouldDeletePersonById(PersonServiceTest.java:68)

However, there were exactly 2 interactions with this mock:
personRepository.findById(1L);
-> at com.softwaremind.crew.people.service.PersonService.deletePerson(PersonService.java:70)

personRepository.delete(
    Person{id=0, firstName='null', lastName='null', location='null', email='null', status='null', role='null', createdOn=null, modifiedOn=null}
);
-> at com.softwaremind.crew.people.service.PersonService.deletePerson(PersonService.java:71)


	at com.softwaremind.crew.people.service.PersonServiceTest.shouldDeletePersonById(PersonServiceTest.java:68)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
	at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
	at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
	at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
	at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)

Nie mam pojęcia jak to naprawić zwłaszcza że dałabym sobie głowe uciąć że to działało:/

0

Sprawdzasz czy została wywołana metoda deleteById(1L), a z tego co zostało wklejone wynika, że: zostały wywołane dwie metody z personRepository: delete oraz findById. Dodatkowo Person ma przypisany id=0, a więc nie ma możliwości, żeby deleteById(1L) się kiedykolwiek wywołało

0

Sądząc po tym:

personRepository.delete(
    Person{id=0, firstName='null', lastName='null', location='null', email='null', status='null', role='null', createdOn=null, modifiedOn=null}
);

obstawiam, że nie ma Person o id 1 w bazie i wszedł Ci w tą ścieżkę:

.orElse(new Person()))
0

Po co testujesz jednostkowo CRUD? Jeśli nie testujesz na bazie, to ten test jest bezwartościowy, jedyne co sprawdzi to to, czy umiesz konfigurować Mockito.
Po co repozytorium do crudowego delete? Jakaś zasady Javy nie pozwala programować normalnie?

0

Są to wytyczne od nauczyciela których muszę się sztywno trzymać, jeżeli nie potrafię sensownie wytłumaczyć, że powinno być inaczej(nawet jak zacznę tłumaczyć to i tak wiem mniej więc muszę się dostosować:)). Co do testów z góry było założone że mam wszystko przetestować bo to dobra praktyka i w sumie się cieszę bo nigdy nie testowałam, ale niestety idzie to jak po grudzie. Testować crud muszę bo to w sumie jedyne metody jakie mam w aplikacji :)."Po co repozytorium do crudowego delete" - tego zdania nie zrozumiałam zbytnio. JPArepo przechowuje crud metody z tego co wiem więc delete też jest pozyskiwane z tego interfejsu.

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