# JUnit 5 & Mockito — Advanced Java

Source: https://www.geekswithgeeks.com/en/advanced-java/adv-testing

> Write unit tests with JUnit 5 assertions and parameterized tests, and isolate a class under test by stubbing its collaborators with Mockito.

## A JUnit 5 test

`@Test` methods use `Assertions.assertEquals`, `assertThrows`, `assertAll`. `@ParameterizedTest` runs one body over many inputs. Mockito creates stub collaborators so you test one unit in isolation.

```java
@Test
void appliesDiscount() {
    PriceService svc = new PriceService(rules);
    assertEquals(90, svc.total(100, "SAVE10"));
}

@Test
void rejectsUnknownCode() {
    when(rules.lookup("X")).thenReturn(Optional.empty());
    assertThrows(BadCode.class, () -> svc.total(100, "X"));
}
```

Test design check

**Quiz:** Why replace a real database call with a mock in a unit test?

- [ ] Mocks are always more accurate than the real thing
- [x] To keep the test fast, deterministic, and focused on one unit
- [ ] Because JUnit cannot call external code
- [ ] To avoid writing assertions

*Answer:* To keep the test fast, deterministic, and focused on one unit. Integration tests still exercise the real DB; unit tests isolate logic so failures point to one place.
