Co dokładnie testować ? Mockować serwis, czy stworzyć jego instancję i zmockować repo?

0

Siema.
Uczę się testować jednostkowo swój kod na przykładzie prostej aplikajci w spring boot. Jak się zapewne spodziewacie mam klasę wystawiającą endpointy (RestController) oraz w niej wstrzykniętą klasę odpowiedzialnej za logikę biznesową (Service)- ta klasa następnie w sobie zawiera wstrzyknięty interfejs implementujący JpaRepo... Problem mam w tym, że nie wiem dokładnie, czy w testach klasy Controller mockować już service ? Czy może stworzyć nową instancję serwisu i zmockować repo?
W testach jednostkowych staram się uniknąć odwoływania się do jakiejkolwiek bazy oraz stawiania Springa.

Wrzucam przykładowy kod:
BookController:

@RestController
@RequestMapping(path = "api/v1/book")
public class BookController {

    private final BookService bookService;

    @Autowired
    public BookController(BookService bookService) {
        this.bookService = bookService;
    }
//endpoints
}

BookService:

@Service
public class BookService {
    private final BookRepository bookRepository;

    @Autowired
    public BookService(BookRepository bookRepository) {
        this.bookRepository = bookRepository;
    }
//logic
}

Repo:

@Repository
public interface BookRepository
        extends JpaRepository<Book, Long> {
}

Przykładowy test w którym mockuję serwis:

class BookControllerTest {
    @Test
    void checkReturningListOfBooks() {
        BookService bookService = mock(BookService.class);
        when(bookService.getBooks()).thenReturn(List.of(
                new Book("1984", "George Orwell", 1984,200),
                new Book("Brave New World", "Huxley", 1984,200)
                )
        );
        BookController bookController = new BookController(bookService);
        assertEquals(List.of(new Book("1984", "George Orwell", 1984,200),
                new Book("Brave New World", "Huxley", 1984,200)).toString(),bookController.getBooks().toString());
    }
}

Bardzo proszę o rady. :)

1

Możesz w ogóle nie mockować i np. dla takiego prostego CRUDa zrobić sobie in-memory db w postaci zwyczajnej mapy. Nie chcę demonizować mocków, są przydatne gdy mamy jakieś zewnętrze zależności i interesuje nas jakaś konkretna zwrotka ale nie nadużywałbym ich :D

1

Naukę pisania testów jednostkowym rozpocząłbym od zrozumienia czym jest ta jednostka i co tak naprawdę powinienem testować. Reszta to tylko narzędzia.

Napisz sobie serwis z jakaś bogatsza logika, dodaj pare ifow, pare parametrów wejściowych i spróbuj pokryć ja testami. Testowanie jednostkowe „should return list of objects” powiedziałbym ze „makes no sense”. Takie proste przypadki lepiej zwykle ograć testem integracyjnym.

Co mogę polecić - na pewno ebooka „Unit testing with Mockito” oraz „Good tests, bad tests” Kaczanowskiego. Ponadto YT

0

czy w testach klasy Controller mockować już service

xD I co dokładnie ten test będzie sprawdzać? :D https://github.com/Pharisaeus/almost-s3 idź i nie grzesz więcej.

Przecież ten "test" który napisałeś nie sprawdza ABSOLUTNIE NIC. Sprawdza tylko czy mockito działa :D Pomysł z testowaniem klas to bzdura, a pomysł z pisaniem testu kontrolera (który z definicji nie powinien zawierać żadnej logiki) to już w ogóle jakieś szaleństwo.

0

Moim zdaniem controllery i repozytoria powinny być na tyle proste by ich nie było sensu testować. Servisy potestuj, a właściwie to funkcjonalności jakie dostarczają.

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