Test Slices
Spring Boot MULTIPLE "TEST SLICE" annotations DETA hai — HAR EK, application ka EK SPECIFIC "SLICE" LOAD karta hai, POORA CONTEXT NAHI. @WebMvcTest (SIRF WEB LAYER — controllers, filters), @DataJpaTest (SIRF JPA — repositories, EntityManager, IN-MEMORY database AUTOMATICALLY), @JsonTest (SIRF JSON serialization).
Ye SLICES @SpringBootTest se BAHUT FASTER hain — POORA APPLICATION CONTEXT (SAB beans) LOAD NAHI karte, SIRF RELEVANT beans. LARGE applications mein, YE SPEED DIFFERENCE (SLICE vs FULL context) TEST SUITE ke RUN TIME mein DRAMATIC IMPACT DAALTA hai.
// @DataJpaTest — SIRF JPA layer, IN-MEMORY H2 automatically:
@DataJpaTest
class UserRepositoryTest {
@Autowired
private UserRepository repository;
@Autowired
private TestEntityManager entityManager;
@Test
void shouldFindByEmail() {
entityManager.persist(new User("aarav@example.com"));
Optional<User> found = repository.findByEmail("aarav@example.com");
assertThat(found).isPresent();
}
}
// @JsonTest — SIRF JSON serialization:
@JsonTest
class UserJsonTest {
@Autowired
private JacksonTester<User> json;
@Test
void shouldSerializeToJson() throws Exception {
assertThat(json.write(new User("Aarav"))).hasJsonPathStringValue("$.name");
}
}- @WebMvcTest, @DataJpaTest, @JsonTest = FOCUSED, PARTIAL application context
- @SpringBootTest se BAHUT FASTER — sirf RELEVANT beans LOAD hote hain
- Test SLICE choice, KYA test ho raha hai, us par DEPEND karta hai
@DataJpaTest SIRF JPA-related beans LOAD karta hai (repositories, EntityManager) — SERVICE/CONTROLLER layer LOAD NAHI hote. DEFAULT mein, IN-MEMORY database (H2) AUTOMATICALLY use hoti hai (agar CLASSPATH par hai), REAL database TOUCH NAHI hoती.
@DataJpaTest
class UserRepositoryTest {
@Autowired
private UserRepository repository;
@Test
void shouldFindByEmail() {
repository.save(new User("test@example.com"));
assertThat(repository.findByEmail("test@example.com")).isPresent();
}
}@JsonTest SIRF JSON serialization/deserialization RELATED beans LOAD karta hai (Jackson ObjectMapper) — TEST karta hai ki JAVA OBJECT, EXPECTED JSON format mein CONVERT hota hai (ya VICE VERSA), bina POORI application load kiye.
@JsonTest
class UserJsonTest {
@Autowired
private JacksonTester<User> json;
@Test
void shouldSerialize() throws Exception {
User user = new User("Aarav", "aarav@example.com");
assertThat(json.write(user)).hasJsonPathStringValue("$.name");
}
}