### Question:
Integrator1D implements Integrator<T, U, Function<U, T>> { @Override public T integrate(Function<U, T> f, U[] lower, U[] upper) { ArgChecker.notNull(f, "function was null"); ArgChecker.notNull(lower, "lower bound array was null"); ArgChecker.notNull(upper, "upper bound array was null"); ArgChecker.notEmpty(lower, "lower bound array was empty"); ArgChecker.notEmpty(upper, "upper bound array was empty"); ArgChecker.notNull(lower[0], "lower bound was null"); ArgChecker.notNull(upper[0], "upper bound was null"); if (lower.length > 1) { log.info("Lower bound array had more than one element; only using the first"); } if (upper.length > 1) { log.info("Upper bound array had more than one element; only using the first"); } return integrate(f, lower[0], upper[0]); }  @Override T integrate(Function<U, T> f, U[] lower, U[] upper); abstract T integrate(Function<U, T> f, U lower, U upper);  }### Answer:
@Test public void testNullFunction() { assertThatIllegalArgumentException() .isThrownBy(() -> INTEGRATOR.integrate(null, L, U)); }
@Test public void testNullLowerBound() { assertThatIllegalArgumentException() .isThrownBy(() -> INTEGRATOR.integrate(F, null, U)); }
@Test public void testNullUpperBound() { assertThatIllegalArgumentException() .isThrownBy(() -> INTEGRATOR.integrate(F, L, null)); }
@Test public void testEmptyLowerBound() { assertThatIllegalArgumentException() .isThrownBy(() -> INTEGRATOR.integrate(F, new Double[0], U)); }
@Test public void testEmptyUpperBound() { assertThatIllegalArgumentException() .isThrownBy(() -> INTEGRATOR.integrate(F, L, new Double[0])); }
@Test public void testNullLowerBoundValue() { assertThatIllegalArgumentException() .isThrownBy(() -> INTEGRATOR.integrate(F, new Double[] {null}, U)); }
@Test public void testNullUpperBoundValue() { assertThatIllegalArgumentException() .isThrownBy(() -> INTEGRATOR.integrate(F, L, new Double[] {null})); }