Iterating over test inputs inside a @Test method executes all cases in a single test invocation: the first failure aborts the remaining cases, and test reports do not identify which input failed.

Using TestParameterInjector with @TestParameter runs each input case in strict isolation with per-case reporting:

@Test
public void parseValidUnits() {
  for (TimeUnit unit : TimeUnit.values()) {
    assertThat(parseUnit(unit.name())).isEqualTo(unit);
  }
}
@RunWith(TestParameterInjector.class)
public final class MyTest {
  @Test
  public void parseValidUnits(@TestParameter TimeUnit unit) {
    assertThat(parseUnit(unit.name())).isEqualTo(unit);
  }
}

For explicit subsets of values, pass the elements to @TestParameter:

@Test
public void acceptsKnownSchemes() {
  for (String scheme : ImmutableList.of("http", "https")) {
    assertThat(isValidScheme(scheme)).isTrue();
  }
}
@RunWith(TestParameterInjector.class)
public final class MyTest {
  @Test
  public void acceptsKnownSchemes(@TestParameter({"http", "https"}) String scheme) {
    assertThat(isValidScheme(scheme)).isTrue();
  }
}