Essa é uma dica de organização em testes unitários (utilizando JUnit).
Nos casos onde devem ser feitos os testes unitários em classes que possuam mais de um método public e/ou protected como no exemplo abaixo:
@Service
private class PersonService {
public Person getById(final UUID id) {
//impl
}
public List<Person> getAll(final Optional filters) {
//impl
}
}
É interessante dividir os testes de cada método por classes aninhadas e anotadas com @Nested e algum padrão de nomenclatura para essas classes, no caso abaixo com prefixo When e a nomenclatura do método como sufixo:
@ExtendWith(MockitoExtension.class)
class ExampleServiceTest {
@InjectMocks
private ExampleService service;
@Nested
class WhenGetById {
@Test
void shouldDoesNotThrow() {
final var result = service.getById(UUID.randomUUID());
//restante do teste
}
}
@Nested
class WhenGetAll {
@Test
void shouldDoesNotThrow() {
final var result = service.getAll(Optional.empty());
//restante do teste
}
}
}
Em casos onde há muitos cenários de teste para o mesmo método (normalmente muitas situações com estados de objetos diferentes) é interessante refinar em mais classes aninhadas e algum outro prefixo como por exemplo With.
@Nested
class WhenGetAll {
@Nested
class WithFilter {
@Test
void shouldDoesNotThrow() {
final var result = service.getAll(Optional.ofNullable(null));
//restante do teste
}
}
@Nested
class WithoutFilter {
@Test
void shouldDoesNotThrow() {
final var result = service.getAll(Optional.empty());
//restante do teste
}
}
}
Além de mais organizado os testes, visualmente em sua IDE (ao menos no IntelliJ) também ficará organizado:
Lembrando que testes unitários quando estão muito complexos para se fazer/construir, é bem possível (e provável) que hajam melhorias na organização do próprio código que auxiliarão na manutenção, leitura e construção dos testes unitários.