2012-04-13 19 views
6

Как использовать assertEquals, чтобы узнать, правильно ли указано сообщение об исключении? Тест проходит, но я не знаю, попадает ли он в правильную ошибку или нет.junit testing - assertEquals for exception

Тест Я бегу.

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

Испытуемый метод.

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;  
} 

}

Спасибо за помощь.

ответ

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

Спасибо! Простой и помог много – Meowbits

4

В assertEquals в вашем примере будет сравнивать возвращаемое значение вызова метода к ожидаемому значению, которое не то, что вы хотите, и, конечно, не будет возвращаемое значение, если ожидаемое исключение. Перемещение assertEquals к блоку улова:

@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

Не видел вашего ответа, я переработал свой код после прочтения вашего ответа. Спасибо! – Meowbits

0

Java 8 Решение

Вот функция полезности, которую я написал:

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)

Используйте его следующим образом:

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

Кроме того, если вы хотите прочитать некоторые причины, почему вы должны не хотите assertTrue, что сообщение Вашего исключения равно определенное значение, увидеть это: https://softwareengineering.stackexchange.com/a/278958/41811

1

отлично работает для меня ,

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

если assertEquals терпит неудачу ComparisonFailure будет обрабатывать его

0

Это хороший , что позволяет утверждать исключения в чистом виде.

Пример:

// 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();