27 Şubat 2018 Salı

JUnit @Parameterized.Parameters Anotasyonu

Giriş
Testin her parametre için ayrı ayrı koşmasını sağlar. Test sınıfının her parametreyi alan bir constructor metodu bulunur.

Örnek
Elimizde şöyle bir kod olsun
public class CalculatorImpl implements Calculator {
 
  @Override
  public double process(String expression) {
    ...
  }
}
Test verisi için şöyle yaparız. Birinci değer girdi string, ikinci değer sonuç, üçündü değer eper varsa exception'dır
@RunWith(Parameterized.class)
public class CalculatorTest {
  @Parameters(name = "{index}: CalculatorTest({0})={1}, throws {2}")
  public static Collection<Object[]> data() {
    return Arrays.asList(new Object[][]{
      {"1 + 1", 2, null},
      {"1 + 1 + 1", 3, null},
      {"1–1", 0, null},
      {"1 * 1", 1, null},
      {"1 / 1", 1, null},
      {"( 1 + 1 )", 2, null},
      {"+", 0, new CalculatorException("Invalid expression: +")},
      {"1 1", 0, new CalculatorException("Invalid expression: 1 1")}
    });
  }

  private final String input;
  private final double expected;
  private final Exception exception;
  
  public CalculatorTest(String input, double expected, Exception exception) {
    this.input = input;
    this.expected = expected;
    this.exception = exception;
  }
...
}
Test için şöyle yaparız
@Test
public void testProcess() {
  Calculator c = new CalculatorImpl();
  try {
    double result = c.process(input);
    if (exception != null) {
      fail("should have thrown an exception: " + exception);
    }
    // shouldn't compare doubles without a delta, because FP math isn't accurate
    assertEquals(expected, result, 0.000001);
  } catch (Exception e) {
   if (exception == null) {
     fail("should not have thrown an exception, but threw " + e);
   }
   if (!exception.getClass().equals(e.getClass()) ||
!exception.getMessage().equals(e.getMessage())) {
     fail("expected exception " + exception + "; got exception " + e);
   }
  }
}
Örnek

Bu örnekte her test 1 ve 2 değerleri için koşar. Şöyle yaparız.
@RunWith(value = Parameterized.class)
public class MyTest {

  private int value;

  @Parameterized.Parameters
  public static List<Object[]> data() {
    return Arrays.asList(new Object[][]{
        {1},
        {2},
    });
  }

  public MyTest(int value) {
    this.value = value;
  }

  @Test
  public void test1() {
    ...
  }

  @Test
  public void test2() {
    ...
  }
}

Hiç yorum yok:

Yorum Gönder