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. :)