TestNG: mit DataProvidern auf Exceptions testen

Das Testframework TestNG bietet DataProvider an, mit deren Hilfe es leicht möglich ist viele Kombinationen von Eingabeparametern zu überprüfen. Aber was macht man, wenn man bei bestimmten Eingaben eine Exception erwartet? Einen zweiten Test mit DataProvidern, so dass man einen Test für valide Eingaben und einen für invalide Eingaben hat? Oder sollte man die invaliden Eingaben lieber in separaten Testcases prüfen, damit man auch prüfen kann, dass die korrekte Exception fliegt?

Ich finde beide Lösungen etwas unübersichtlich. Aber zum Glück gibt es Abhilfe.

public String append(String s, String t)
{
  if (s == null || t == null) throw new NullPointerException();
  return s + t;
}

@DataProvider(name = "providerAppend")
public Object[][] providerAppend()
{
  return new Object[][] {
    { null, null, new NullPointerException() },
    { "", null, new NullPointerException() },
    { null, "", new NullPointerException() },
    {"abc", "def", "abcdef" },
    {"abc", "", "abc" },
    {"", "def", "def" }
  };
}

@Test(dataProvider = "providerAppend")
public void testAppend(String s, String t, Object expected)
{
  if (expected instanceof Exception)
  {
    try
    {
      append(s, t);
      Assert.fail("Expected an exception: " + expected.getClass());
    }
    catch (Exception e)
    {
      Assert.assertEquals(e.getClass(), expected.getClass());
    }
  }
  else
  {
    Assert.assertEquals(append(s,t), expected);
  }
}

In obiger Lösung gehen wir einfach davon aus, dass es für den DataProvider egal ist, ob der Rückgabewert nun eine Wert oder eine Exception ist. Das handling wird dann in der Testmethode übernommen, und zwar dadurch, dass wir unterschiedliche Testimplementierungen wählen, je nachdem ob der erwartete Wert vom Typ Exception ist oder nicht. Wenn er vom Typ Exception ist, dann stellen wir sicher, dass eine Exception geworfen wird, und das die Klasse identisch mit der Erwartung ist. Manchmal kann es sinnvoll sein, denn Klassenvergleich gegen eine instanceof Prüfung zu ersetzen.


Follow

Bekomme jeden neuen Artikel in deinen Posteingang.