# JUnit 5 गहराई से — एडवांस्ड जावा

Source: https://www.geekswithgeeks.com/hi/advanced-java/adv-junit5-deep

> assertEquals, assertThrows, assertAll जैसे पूर्ण अभिकथन टूलकिट का उपयोग करें, और JUnit 5 के lifecycle annotation से प्रति-टेस्ट व प्रति-क्लास सेटअप/टियरडाउन नियंत्रित करें।

## Lifecycle annotation

`@BeforeEach`/`@AfterEach` **हर** टेस्ट मेथड के इर्द-गिर्द चलते हैं (टेस्ट के बीच कोई रिसाव नहीं); `@BeforeAll`/`@AfterAll` पूरी क्लास के लिए **एक बार** चलते हैं और `static` होने चाहिए। `@BeforeAll` का उपयोग केवल महँगे, सुरक्षित साझा सेटअप के लिए करें।

## assertAll व assertThrows

`assertAll` संबंधित अभिकथनों को समूहित करता है ताकि पहला असफल होने पर भी **सभी** चलें और रिपोर्ट हों — अकेला `assertEquals` पहली असफलता पर रुक जाता। `assertThrows` किसी विशेष exception प्रकार की पुष्टि करता है।

```java
@Test
void orderValidation() {
    Order o = new Order(-5, "");
    assertAll(
        () -> assertTrue(o.hasErrors()),
        () -> assertEquals(2, o.errorCount())
    );

    var ex = assertThrows(IllegalArgumentException.class,
        () -> new Order(-1, "x"));
    assertTrue(ex.getMessage().contains("quantity"));
}
```

## Parameterized टेस्ट

`@ParameterizedTest` के साथ `@ValueSource`, `@CsvSource`, या `@MethodSource` एक ही टेस्ट बॉडी को हर इनपुट पर चलाता है, कॉपी-पेस्ट किए `@Test` मेथड की जगह लेता है।

```java
@ParameterizedTest
@CsvSource({"2,4", "3,9", "5,25"})
void squares(int in, int expected) {
    assertEquals(expected, MathUtil.square(in));
}
```
