2012-04-13 15 views
6

Wie kann ich assertEquals verwenden, um festzustellen, ob die Ausnahmebedingungsnachricht korrekt ist? Der Test läuft, aber ich weiß nicht, ob es den richtigen Fehler trifft oder nicht.Junit-Test - assertEquals für Ausnahme

Der Test läuft ich.

@Test 
public void testTC3() 
{ 
    try { 
    assertEquals("Legal Values: Package Type must be P or R", Shipping.shippingCost('P', -5)); 
    } 
    catch (Exception e) { 
    }   
} 

Die zu testende Methode.

public static int shippingCost(char packageType, int weight) throws Exception 
{ 
    String e1 = "Legal Values: Package Type must be P or R"; 
    String e2 = "Legal Values: Weight < 0"; 
    int cost = 0; 
     if((packageType != 'P')&&(packageType != 'R')) 
     { 
      throw new Exception(e1); 
     } 

     if(weight < 0) 
     { 
      throw new Exception(e2); 
     }   
     if(packageType == 'P') 
     { 
      cost += 10; 
     } 
     if(weight <= 25) 
     { 
      cost += 10; 
     } 
     else 
     { 
      cost += 25; 
     } 
     return cost;  
} 

}

Danke für die Hilfe.

Antwort

6
try { 
    assertEquals("Legal Values: Package Type must be P or R", Shipping.shippingCost('P', -5)); 
    Assert.fail("Should have thrown an exception"); 
} 
catch (Exception e) { 
    String expectedMessage = "this is the message I expect to get"; 
    Assert.assertEquals("Exception message must be correct", expectedMessage, e.getMessage()); 
} 
+1

Thank you! Einfach und viel geholfen – Meowbits

4

Die assertEquals in Ihrem Beispiel würde den Rückgabewert des Methodenaufruf zu dem erwarteten Wert werden zu vergleichen, die nicht das, was Sie wollen, und natürlich gibt es einen Rückgabewert nicht, wenn das sein würde erwartete Ausnahme tritt auf. Verschieben Sie die assertEquals an den catch-Block:

@Test 
public void testTC3() 
{ 
    try { 
     Shipping.shippingCost('P', -5); 
     fail(); // if we got here, no exception was thrown, which is bad 
    } 
    catch (Exception e) { 
     final String expected = "Legal Values: Package Type must be P or R"; 
     assertEquals(expected, e.getMessage()); 
    }   
} 
+0

Habe deine Antwort nicht gesehen, ich habe meinen Code nach dem Lesen deiner Antwort überarbeitet. Vielen Dank! – Meowbits

0

Java 8 Lösung

Hier ist eine Nutzenfunktion, die ich schrieb:

public final <T extends Throwable> T expectException(Class<T> exceptionClass, Runnable runnable) 
{ 
    try 
    { 
     runnable.run(); 
    } 
    catch(Throwable throwable) 
    { 
     if(throwable instanceof AssertionError && throwable.getCause() != null) 
      throwable = throwable.getCause(); //allows "assert x != null : new IllegalArgumentException();" 
     assert exceptionClass.isInstance(throwable) : throwable; //exception of the wrong kind was thrown. 
     assert throwable.getClass() == exceptionClass : throwable; //exception thrown was a subclass, but not the exact class, expected. 
     @SuppressWarnings("unchecked") 
     T result = (T)throwable; 
     return result; 
    } 
    assert false; //expected exception was not thrown. 
    return null; //to keep the compiler happy. 
} 

(taken from my blog)

Verwenden Sie es wie folgt:

@Test 
public void testThrows() 
{ 
    RuntimeException e = expectException(RuntimeException.class,() -> 
     { 
      throw new RuntimeException("fail!"); 
     }); 
    assert e.getMessage().equals("fail!"); 
} 

Auch wenn Sie einige Gründe lesen möchten, warum Sie sollten nicht zu assertTrue möchten, dass die Botschaft Ihrer Ausnahme auf einen bestimmten Wert gleich ist, sehen: https://softwareengineering.stackexchange.com/a/278958/41811

1

funktioniert perfekt für mich .

try{ 
    assertEquals("text", driver.findElement(By.cssSelector("html element")).getText()); 
    }catch(ComparisonFailure e){ 
     System.err.println("assertequals fail"); 
    } 

wenn assertEquals nicht ComparisonFailure damit umgehen

0

Das ist schön , die behaupten, Ausnahmen in einer sauberen Art und Weise ermöglicht.

Beispiel:

// given: an empty list 
List myList = new ArrayList(); 

// when: we try to get the first element of the list 
when(myList).get(1); 

// then: we expect an IndexOutOfBoundsException 
then(caughtException()) 
     .isInstanceOf(IndexOutOfBoundsException.class) 
     .hasMessage("Index: 1, Size: 0") 
     .hasNoCause(); 
Verwandte Themen