2012-04-13 31 views
6

Làm cách nào để sử dụng assertEquals để xem thông báo ngoại lệ có chính xác không? Bài kiểm tra trôi qua nhưng tôi không biết liệu nó có đạt được lỗi chính xác hay không.junit testing - assertEquals for exception

Bài kiểm tra tôi đang chạy.

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

Phương pháp đang được thử nghiệm.

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

}

Thanks for the help.

Trả lời

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

Cảm ơn bạn! Đơn giản và đã giúp rất nhiều – Meowbits

4

Xác nhậnCác ví dụ trong ví dụ của bạn sẽ so sánh giá trị trả về của cuộc gọi phương thức với giá trị mong muốn, không phải là thứ bạn muốn và tất nhiên sẽ không có giá trị trả về nếu ngoại lệ dự kiến ​​xảy ra. Di chuyển assertEquals cho khối catch:

@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

Không thấy câu trả lời của bạn, tôi đã làm lại mã của tôi sau khi đọc câu trả lời của bạn. Cảm ơn bạn! – Meowbits

0

Java 8 giải pháp

Đây là một chức năng hữu ích mà tôi đã viết:

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)

Sử dụng nó như sau:

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

Ngoài ra, nếu bạn muốn đọc một số lý do tại sao bạn nên không muốn assertTrue rằng thông điệp của ngoại trừ của bạn là tương đương với một giá trị cụ thể, thấy điều này: https://softwareengineering.stackexchange.com/a/278958/41811

1

trình hoàn hảo cho tôi .

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

nếu assertEquals thất bại ComparisonFailure sẽ xử lý nó

0

này là tốt đẹp cho phép khẳng định trường hợp ngoại lệ trong một cách sạch sẽ.

Ví dụ:

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