100 pytań kontrolnych z odpowiedziami • Informatyka, rok 3 / semestr 6 • WSZiB
Jak korzystać: najpierw spróbujcie Państwo odpowiedzieć samodzielnie, potem klikamy w pytanie, aby odsłonić odpowiedź.
Pytania obejmują cały materiał zajęć: Spring Boot, IoC/DI, AOP, REST, JPA + H2, Spring Security,
konfigurację aplikacji oraz testowanie (Spring Boot Test + Mockito).
I. Spring Boot — podstawy i autokonfiguracja
1.Czym jest Spring Boot i co odróżnia go od „czystego” frameworka Spring?
Odpowiedź: Spring Boot to nakładka na Spring Framework, która dzięki autokonfiguracji, starterom i wbudowanemu serwerowi pozwala uruchomić aplikację niemal bez ręcznej konfiguracji (bez plików XML).
2.Jakie trzy mechanizmy uruchamia adnotacja umieszczana nad klasą główną aplikacji?
Odpowiedź:@SpringBootApplication łączy: @Configuration (klasa jako źródło beanów), @EnableAutoConfiguration (automatyczna konfiguracja na podstawie zależności) i @ComponentScan (skanowanie pakietów w poszukiwaniu komponentów).
3.Co dokładnie robi @EnableAutoConfiguration?
Odpowiedź: Pozwala Spring Bootowi automatycznie skonfigurować komponenty aplikacji na podstawie zależności znalezionych na classpath (np. obecność startera web → konfiguracja Tomcata i Spring MVC).
4.Za co odpowiada wywołanie SpringApplication.run(Main.class, args)?
Odpowiedź: Tworzy i uruchamia kontekst aplikacji (kontener IoC) oraz startuje wbudowany serwer Tomcat; zwraca ApplicationContext, z którego można pobierać beany.
5.Jak nazywa się narzędzie online do generowania szkieletu projektu Spring Boot?
Odpowiedź: Spring Initializr (start.spring.io) — wybieramy w nim m.in. system budowania (Maven/Gradle), wersję Javy i startery.
6.Czym jest starter, np. spring-boot-starter-web, i co „przynosi” do projektu?
Odpowiedź: Starter to gotowy zestaw spójnych zależności Maven/Gradle dla danej funkcjonalności; starter web dodaje Spring MVC, wbudowanego Tomcata i obsługę JSON.
7.Pod jakim adresem domyślnie dostępna jest uruchomiona aplikacja webowa Spring Boot?
Odpowiedź:http://localhost:8080 — 8080 to domyślny port wbudowanego serwera Tomcat.
8.Jaki serwer aplikacyjny jest domyślnie wbudowany w aplikację Spring Boot z modułem web?
Odpowiedź: Apache Tomcat — uruchamiany automatycznie wraz z aplikacją, bez osobnej instalacji.
9.W jakim pliku i w jakiej lokalizacji umieszczamy ustawienia aplikacji?
Odpowiedź: W pliku application.properties w katalogu src/main/resources.
10.W którym katalogu projektu muszą znaleźć się szablony HTML, aby silnik szablonów je odnalazł?
Odpowiedź:src/main/resources/templates — stamtąd Spring pobiera np. index.html, gdy kontroler zwróci nazwę widoku „index”.
11.Jaka biblioteka (silnik szablonów) renderuje widoki HTML zwracane przez kontroler MVC?
Odpowiedź: Thymeleaf — zamienia szablon z folderu templates na stronę HTML wysyłaną do przeglądarki.
12.Metoda kontrolera zwraca napis "index". Co stanie się z tą wartością w zależności od tego, czy klasa ma @Controller, czy @RestController?
Odpowiedź: Przy @Controller napis to nazwa widoku — wyświetli się szablon index.html; przy @RestController napis „index” zostanie wysłany dosłownie jako treść odpowiedzi HTTP.
13.Jak nazywa się główny plik konfiguracyjny Mavena i co opisuje?
Odpowiedź:pom.xml — opisuje zależności (w tym startery), wersję Javy, pluginy i sposób budowania projektu.
14.Wymień trzy praktyczne zalety używania Spring Boot zamiast ręcznej konfiguracji.
Odpowiedź: (1) autokonfiguracja — minimalna ilość kodu konfiguracyjnego, (2) wbudowany serwer — uruchamianie aplikacji jednym poleceniem, (3) startery — spójne, przetestowane zestawy zależności.
II. Spring Core — IoC, DI i adnotacje komponentów
15.Wyjaśnij własnymi słowami, na czym polega odwrócenie sterowania (IoC).
Odpowiedź: Zamiast tego, by obiekty same tworzyły swoje zależności (operatorem new), odpowiedzialność za tworzenie obiektów i dostarczanie ich tam, gdzie są potrzebne, przejmuje kontener (Spring).
16.Czym jest Dependency Injection i jak ma się do IoC?
Odpowiedź: DI to technika realizacji IoC — zależności obiektu są „wstrzykiwane” z zewnątrz przez kontener, zamiast być tworzone wewnątrz klasy.
17.Co w terminologii Springa oznacza słowo „bean”?
Odpowiedź: Obiekt, którego cyklem życia (tworzenie, konfiguracja, wstrzykiwanie, niszczenie) zarządza kontener IoC Springa.
18.Jak nazywa się główny kontener IoC w Springu, zarządzający wszystkimi beanami?
Odpowiedź:ApplicationContext.
19.Wymień trzy miejsca, w których można umieścić @Autowired, aby wstrzyknąć zależność.
Odpowiedź: Nad konstruktorem, bezpośrednio nad polem klasy oraz nad setterem.
20.Który sposób wstrzykiwania zależności jest zalecany i dlaczego?
Odpowiedź: Przez konstruktor — pole może być final, zależności są jawne i obowiązkowe, a klasę łatwo testować (można podać atrapę w teście).
21.Co łączy adnotacje @Service, @Repository i @Controller?
Odpowiedź: Wszystkie są specjalizacjami @Component — rejestrują beana, a dodatkowo komunikują rolę klasy w architekturze (serwis, dostęp do danych, warstwa web).
22.Klasę z logiką biznesową chcesz zarejestrować jako bean. Której adnotacji użyjesz zgodnie z konwencją?
Odpowiedź:@Service — to specjalizacja @Component przeznaczona dla warstwy serwisowej (logiki biznesowej).
23.Co — poza rejestracją beana — robi dodatkowo @Repository?
Odpowiedź: Obsługuje wyjątki związane z bazą danych i konwertuje je na spójną hierarchię DataAccessException.
24.Masz dwa beany implementujące interfejs MyService. Jak przy wstrzykiwaniu wskazać konkretny z nich?
Odpowiedź: Adnotacją @Qualifier("nazwaBeana") przy parametrze konstruktora, np. public MyController(@Qualifier("secondService") MyService s).
25.Czym różni się działanie @Primary od @Qualifier?
Odpowiedź:@Primary oznacza beana jako domyślny wybór, gdy jest wiele kandydatów; @Qualifier jawnie wskazuje konkretnego beana w miejscu wstrzyknięcia (ma pierwszeństwo).
26.Jak w metodzie main() pobrać beana klasy Car z kontekstu aplikacji?
Odpowiedź:
ApplicationContext context = SpringApplication.run(Main.class, args);
Car car = context.getBean(Car.class);
27.Spring znajduje dwa pasujące beany do wstrzyknięcia, a programista nie wskazał żadnego. Co się stanie?
Odpowiedź: Start aplikacji zakończy się błędem niejednoznaczności (NoUniqueBeanDefinitionException) — kontener nie wie, którą implementację wybrać; pomaga @Primary lub @Qualifier.
28.Konstruktor beana wymaga zależności, której kontener w ogóle nie zna (klasa bez adnotacji). Jak zachowa się aplikacja?
Odpowiedź: Nie wystartuje — Spring zgłosi błąd „required a bean of type ... that could not be found” (NoSuchBeanDefinitionException).
29.Dlaczego obiekt utworzony ręcznie operatorem new nie skorzysta z dobrodziejstw Springa?
Odpowiedź: Taki obiekt powstaje poza kontenerem — Spring nie wstrzyknie do niego zależności, nie obejmie go aspektami AOP ani nie będzie zarządzał jego cyklem życia.
30.Jak zarejestrować w kontekście beana, którego klasy nie możesz oznaczyć @Component (np. z obcej biblioteki)?
Odpowiedź: Tworząc w klasie @Configuration metodę oznaczoną @Bean, która zwraca gotowy obiekt — Spring zarejestruje go w kontekście.
31.Jaką rolę pełni klasa oznaczona @Configuration?
Odpowiedź: Jest źródłem konfiguracji Springa — zawiera metody @Bean definiujące beany (zastępuje dawne pliki XML).
32.Skąd Spring „wie”, że ma utworzyć instancję klasy oznaczonej @Component?
Odpowiedź: Mechanizm @ComponentScan (część @SpringBootApplication) skanuje pakiet klasy głównej i podpakiety, rejestrując wszystkie znalezione komponenty jako beany.
III. Spring AOP — programowanie aspektowe
33.Jaki problem rozwiązuje programowanie aspektowe (AOP)?
Odpowiedź: Pozwala oddzielić logikę przekrojową (cross-cutting concerns) — powtarzającą się w wielu miejscach — od logiki biznesowej, bez modyfikowania kodu biznesowego.
34.Podaj cztery przykłady logiki przekrojowej, którą wygodnie realizować aspektami.
Odpowiedź: Logowanie wywołań metod, zarządzanie transakcjami, sprawdzanie uprawnień (bezpieczeństwo), pomiar czasu wykonania (monitorowanie wydajności).
35.Co to jest aspekt i jakimi adnotacjami oznacza się klasę aspektu?
Odpowiedź: Aspekt to zbiór wspólnej logiki stosowanej do wielu metod w aplikacji; klasę oznacza się @Aspect oraz @Component (żeby była beanem).
36.Co oznacza pojęcie join point w Spring AOP?
Odpowiedź: Punkt w programie, w którym można zastosować aspekt — w Springu są to przede wszystkim wywołania metod.
37.Czym jest advice?
Odpowiedź: Logika (kod), która ma zostać wykonana w danym join point — przed metodą, po niej lub wokół jej wywołania.
38.Czym jest pointcut i jaką pełni rolę względem advice?
Odpowiedź: Pointcut to wyrażenie wskazujące, które join points (metody) mają podlegać danemu advice — czyli „gdzie” aspekt ma zadziałać.
39.Co oznacza pojęcie weaving?
Odpowiedź: Proces „wplatania” aspektów do aplikacji — w czasie kompilacji, ładowania klas lub wykonywania programu.
40.Wymień pięć rodzajów advice dostępnych w Spring AOP.
Odpowiedź: Before, After (finally), After Returning, After Throwing oraz Around.
41.Czym różni się advice After od After Returning?
Odpowiedź: After wykonuje się zawsze po metodzie (sukces lub wyjątek), a After Returning tylko wtedy, gdy metoda zakończyła się bezbłędnie.
42.Który advice wykona się, gdy metoda rzuci wyjątek — i tylko wtedy?
Odpowiedź: After Throwing.
43.Dlaczego Around advice uważa się za najbardziej elastyczny?
Odpowiedź: Działa przed i po wywołaniu metody, dając pełną kontrolę: może modyfikować argumenty, zmieniać wynik, a nawet zdecydować, że metoda w ogóle się nie wykona.
44.Co oznacza wyrażenie pointcut execution(* com.example.car.*.*(..))?
Odpowiedź: Dowolna metoda (dowolny typ zwracany *, dowolna nazwa *, dowolne argumenty (..)) w dowolnej klasie pakietu com.example.car.
IV. Spring Web — kontrolery i REST API
45.Jaką rolę pełni kontroler we wzorcu MVC, na którym opiera się Spring MVC?
Odpowiedź: Obsługuje żądania HTTP od klienta i zwraca odpowiedź — model reprezentuje dane, widok generuje stronę dla użytkownika.
46.Co robi @RequestMapping i czym różnią się od niego @GetMapping i spółka?
Odpowiedź:@RequestMapping mapuje żądania HTTP na metody/klasy kontrolera (dowolna metoda HTTP); @GetMapping, @PostMapping, @PutMapping, @DeleteMapping to jego skrócone wersje dla konkretnych metod HTTP.
47.Jakiej adnotacji użyjesz, aby metoda kontrolera obsłużyła żądanie usunięcia zasobu?
Odpowiedź:@DeleteMapping("/adres") — mapuje żądanie HTTP DELETE na metodę.
48.Użytkownik wywołuje adres /search?name=Jan. Jak odebrać wartość „Jan” w metodzie kontrolera?
Odpowiedź: Parametrem z adnotacją @RequestParam:
@GetMapping("/search")
public List<User> search(@RequestParam String name) { ... }
49.Endpoint ma adres /user/{id}. Jak odczytać wartość id ze ścieżki?
Odpowiedź: Adnotacją @PathVariable:
@GetMapping("/user/{id}")
public User getUser(@PathVariable Long id) { ... }
50.Klient wysyła w żądaniu POST obiekt JSON. Jaka adnotacja zamieni go na obiekt Java?
Odpowiedź:@RequestBody — konwertuje ciało żądania HTTP (np. JSON) na obiekt Java podany jako parametr metody.
51.Co robi @ResponseBody i dlaczego w klasie @RestController nie trzeba go dopisywać?
Odpowiedź: Sprawia, że metoda zwraca dane (JSON/XML) bezpośrednio w treści odpowiedzi; @RestController to połączenie @Controller + @ResponseBody, więc działa to automatycznie dla wszystkich metod.
52.Metoda @RestController zwraca ArrayList<Student>. Co dokładnie zobaczy klient w przeglądarce?
Odpowiedź: Tablicę JSON z obiektami, np. [{"id":1,"imie":"Adam","wiek":21}, ...] — Spring automatycznie serializuje kolekcję do JSON.
53.Formularz HTML wysyła dane metodą POST na adres /submit. Jak wygląda szkielet metody kontrolera odbierającej pola name i age?
Odpowiedź:
@PostMapping("/submit")
public ResponseEntity<String> handleForm(
@RequestParam String name,
@RequestParam int age) { ... }
Dane z formularza odbiera się przez @RequestParam (pola formularza to parametry żądania).
54.Czym różni się zwrócenie z metody zwykłego String od zwrócenia ResponseEntity<String>?
Odpowiedź:ResponseEntity reprezentuje całą odpowiedź HTTP — pozwala jawnie ustawić kod statusu i nagłówki (np. ResponseEntity.ok("...") = 200 OK z treścią), a sam String to tylko treść.
55.Do czego służy adnotacja @CrossOrigin nad kontrolerem?
Odpowiedź: Zezwala na żądania z innego pochodzenia (origin) niż serwer — np. z formularza otwartego lokalnie z pliku — czyli obsługuje mechanizm CORS.
56.Czym jest DTO i po co używać go w kontrolerze zamiast wielu osobnych parametrów?
Odpowiedź: DTO (Data Transfer Object) to prosty obiekt przenoszący dane żądania/odpowiedzi; porządkuje kod — jedna struktura zamiast listy parametrów — i łatwo mapuje się z JSON przez @RequestBody.
57.Dlaczego rekord (record) z Javy dobrze nadaje się na obiekt zwracany jako JSON?
Odpowiedź: Rekord jest zwięzły i niemutowalny, a automatycznie wygenerowane akcesory pól pozwalają Springowi bez dodatkowego kodu zserializować go do JSON.
58.Jak najprościej przetestować w przeglądarce endpoint GET zwracający JSON?
Odpowiedź: Wpisać jego adres (np. localhost:8080/lista) w pasku adresu — przeglądarka wykonuje żądanie GET i wyświetli zwrócony JSON.
59.Kontroler ma metodę z @GetMapping("/springboot"). Pod jakim pełnym adresem lokalnie ją wywołasz?
Odpowiedź:http://localhost:8080/springboot.
60.Strona główna aplikacji ma zawierać klikalne odnośniki do dwóch endpointów REST. Jak można to zrealizować w kontrolerze?
Odpowiedź: Metoda @GetMapping("/") może zwrócić widok (szablon index.html z linkami) przy @Controller, albo — w wersji minimalnej — kod HTML z odnośnikami <a href="/springboot"> jako tekst odpowiedzi.
V. Spring Data JPA, Hibernate i baza H2
61.Czym jest ORM i jaki problem rozwiązuje?
Odpowiedź: Mapowanie obiektowo-relacyjne — automatyczne tłumaczenie między obiektami Java a tabelami relacyjnej bazy danych, dzięki czemu nie piszemy ręcznie SQL dla typowych operacji.
62.Jaką rolę w Spring Data JPA pełni Hibernate?
Odpowiedź: Jest implementacją standardu JPA — to on faktycznie generuje zapytania SQL i mapuje wyniki na encje.
63.Jaką adnotacją oznaczamy klasę, aby stała się encją mapowaną na tabelę?
Odpowiedź:@Entity — klasa staje się encją JPA odpowiadającą tabeli w bazie.
64.Po co encji dodaje się @Table(name = "users"), skoro działa też bez tego?
Odpowiedź: Aby jawnie wskazać nazwę tabeli — bez tej adnotacji Hibernate użyje nazwy wyprowadzonej z nazwy klasy, co bywa problemem (np. user to słowo zastrzeżone w niektórych bazach).
65.Jaką rolę pełni adnotacja @Id w encji?
Odpowiedź: Oznacza pole będące kluczem głównym (primary key) tabeli.
66.Co oznacza @GeneratedValue(strategy = GenerationType.IDENTITY) nad polem id?
Odpowiedź: Wartość klucza głównego generuje automatycznie baza danych (kolumna auto-increment) — nie ustawiamy id ręcznie.
67.Napisz deklarację repozytorium Spring Data JPA dla encji User z kluczem typu Long.
Odpowiedź:
public interface UserRepository extends JpaRepository<User, Long> { }
Dwa parametry generyczne to typ encji i typ klucza głównego.
68.Repozytorium to tylko interfejs — skąd biorą się działające metody save(), findAll(), findById(), delete()?
Odpowiedź: Spring Data JPA generuje implementację interfejsu automatycznie w czasie działania aplikacji — programista nie pisze żadnego kodu tych metod.
69.W repozytorium dopisano metodę Optional<User> findByName(String name). Skąd Spring wie, jakie zapytanie wykonać?
Odpowiedź: Z konwencji nazewniczej (query method): człon findBy + nazwa pola Name → zapytanie WHERE name = ? generowane automatycznie.
70.Czym jest baza H2 i dlaczego jest wygodna na zajęciach i w testach?
Odpowiedź: Lekka relacyjna baza danych, która może działać w pamięci (in-memory) — nie wymaga instalacji, startuje razem z aplikacją i ma webową konsolę do podglądu danych.
71.Co oznacza adres jdbc:h2:mem:testdb i jaka jest konsekwencja członu mem?
Odpowiedź: Baza H2 o nazwie testdb działająca w pamięci RAM — dane znikają po zatrzymaniu aplikacji.
72.Wymień właściwości z application.properties, które konfigurują połączenie ze źródłem danych.
Odpowiedź:spring.datasource.url, spring.datasource.driverClassName, spring.datasource.username, spring.datasource.password (plus np. dialekt: spring.jpa.database-platform).
73.Jakie zadanie realizuje wpis spring.jpa.hibernate.ddl-auto=update?
Odpowiedź: Hibernate przy starcie aplikacji sam tworzy/aktualizuje schemat bazy (tabele, kolumny) na podstawie definicji encji.
74.Jak podejrzeć zawartość bazy H2 z poziomu przeglądarki?
Odpowiedź: Przez konsolę H2 dostępną pod localhost:8080/h2-console (po włączeniu jej w konfiguracji), podając URL JDBC i dane logowania z application.properties.
75.Opisz typowy przepływ żądania w aplikacji warstwowej z JPA — od kontrolera do bazy.
Odpowiedź: Kontroler (@RestController) odbiera żądanie → wywołuje serwis (@Service) z logiką biznesową → serwis korzysta z repozytorium (JpaRepository) → Hibernate wykonuje SQL na bazie.
76.Dlaczego zapisywanie danych umieszczamy w serwisie, a nie bezpośrednio w kontrolerze?
Odpowiedź: Separacja odpowiedzialności: kontroler tylko obsługuje HTTP, serwis skupia logikę biznesową (łatwiejsze testowanie, ponowne użycie, miejsce na @Transactional).
VI. Spring Security
77.Co dzieje się z aplikacją zaraz po dodaniu zależności spring-boot-starter-security, zanim cokolwiek skonfigurujesz?
Odpowiedź: Wszystkie endpointy zostają objęte ochroną — pojawia się domyślna strona logowania, użytkownik user i jednorazowe hasło wypisywane w konsoli.
78.Czym różni się uwierzytelnianie (authentication) od autoryzacji (authorization)?
Odpowiedź: Uwierzytelnianie odpowiada na pytanie „kim jesteś?” (weryfikacja loginu i hasła), autoryzacja — „co możesz?” (sprawdzenie uprawnień/ról do zasobu).
79.Jaką rolę pełni bean UserDetailsService?
Odpowiedź: Dostarcza Springowi dane użytkowników (login, zakodowane hasło, role) podczas logowania.
80.Czym jest InMemoryUserDetailsManager i do jakich zastosowań się nadaje?
Odpowiedź: Implementacja przechowująca użytkowników w pamięci aplikacji — wygodna do nauki, demo i testów; w produkcji użytkowników trzyma się np. w bazie.
81.Uzupełnij schemat tworzenia użytkownika testowego: User.builder().username("student")...
Odpowiedź:
UserDetails user = User.builder()
.username("student")
.password(encoder.encode("123456"))
.roles("STUDENT")
.build();
Kolejno: hasło (zakodowane!), role, na końcu build().
82.Dlaczego hasło przed zapisaniem przepuszcza się przez PasswordEncoder?
Odpowiedź: Encoder koduje hasło funkcją jednokierunkową (np. BCrypt) — nawet jeśli baza wycieknie, oryginalnych haseł nie da się łatwo odtworzyć.
83.Co definiuje bean typu SecurityFilterChain?
Odpowiedź: Reguły bezpieczeństwa aplikacji webowej: które adresy są chronione i dla jakich ról, sposób logowania (np. formLogin) i wylogowania.
84.Co dokładnie oznacza reguła .requestMatchers("/admin").hasRole("ADMIN")?
Odpowiedź: Dostęp do adresu /admin ma wyłącznie zalogowany użytkownik posiadający rolę ADMIN.
85.Jaki skutek ma .anyRequest().permitAll() na końcu konfiguracji i dlaczego kolejność reguł ma znaczenie?
Odpowiedź: Wszystkie pozostałe (niewymienione wcześniej) adresy są publiczne; reguły sprawdzane są od góry, więc bardziej szczegółowe (np. /admin) muszą stać przed ogólną.
86.Niezalogowany użytkownik próbuje wejść na chroniony adres przy włączonym formLogin(). Jak zachowa się aplikacja?
Odpowiedź: Przekieruje go na stronę logowania; po poprawnym zalogowaniu (i odpowiedniej roli) uzyska dostęp do żądanej strony.
87.Jak skonfigurować wylogowanie tak, by po nim użytkownik trafiał na stronę główną?
Odpowiedź:.logout(logout -> logout.logoutSuccessUrl("/")) — po wylogowaniu następuje przekierowanie na /.
88.Jakimi adnotacjami można zabezpieczyć pojedynczą metodę (a nie cały adres URL)?
Odpowiedź:@Secured("ROLE_ADMIN"), @PreAuthorize("hasRole('ADMIN')") lub @RolesAllowed({"ADMIN","USER"}).
VII. Konfiguracja aplikacji
89.Po co rozdziela się wartości konfiguracyjne (porty, adresy baz, nazwy) od kodu Java?
Odpowiedź: Można je zmieniać bez rekompilacji programu i łatwo utrzymywać różne ustawienia dla różnych środowisk (dev/test/produkcja).
90.W pliku konfiguracyjnym jest wpis app.name=MojaAplikacja. Jak wstrzyknąć tę wartość do pola klasy?
Odpowiedź:
@Value("${app.name}")
private String appName;
91.Jaką rolę pełni adnotacja @PropertySource("classpath:moje.properties") nad klasą konfiguracji?
Odpowiedź: Wskazuje dodatkowy plik z właściwościami, z którego Spring wczyta wartości (dostępne potem np. przez @Value).
92.Co się stanie przy starcie, jeśli @Value("${brakujacy.klucz}") wskaże klucz, którego nie ma w konfiguracji?
Odpowiedź: Tworzenie beana zakończy się błędem (nierozwiązany placeholder) i aplikacja nie wystartuje — chyba że podamy wartość domyślną.
93.Jak w @Value zapisać wartość domyślną na wypadek braku klucza?
Odpowiedź: Po dwukropku: @Value("${app.name:NazwaDomyslna}").
94.Gdzie poza @Value „trafiają” wpisy z application.properties? Podaj przykład z JPA lub serwera.
Odpowiedź: Czyta je autokonfiguracja Spring Boota — np. spring.datasource.url konfiguruje połączenie z bazą, a spring.jpa.hibernate.ddl-auto zachowanie Hibernate, bez żadnego kodu po naszej stronie.
VIII. Spring Boot Test + Mockito
95.Czym różni się test jednostkowy od testu integracyjnego?
Odpowiedź: Jednostkowy sprawdza pojedynczą klasę/metodę w izolacji (zależności zastępują mocki); integracyjny weryfikuje współdziałanie komponentów i konfigurację Springa (ładuje kontekst).
96.Co robi adnotacja @SpringBootTest nad klasą testową?
Odpowiedź: Ładuje pełny kontekst aplikacji Spring na potrzeby testu — tak jak przy normalnym starcie aplikacji.
97.Po co w wygenerowanym projekcie istnieje pusty test contextLoads()?
Odpowiedź: To „sanity check” — sprawdza, czy kontekst Springa w ogóle się buduje; jeśli konfiguracja lub beany są błędne, ten test nie przejdzie.
98.Czym jest mock i jaki problem rozwiązuje w testach?
Odpowiedź: Atrapa obiektu, której odpowiedzi definiujemy w teście — pozwala testować klasę w izolacji, bez prawdziwych zależności (bazy, sieci, innych serwisów).
99.Jak w Mockito ustalić, co mock ma zwrócić, i jak sprawdzić, że metoda została wywołana?