Junit testing - assertEquals for exception

How can I use assertEquals to validate an exception message? The test passes, but I do not know if it falls into the correct error or not.

The test that I run.

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

The tested method.

 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.

+6
source share
5 answers
 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() ); } 
+6
source

In your example, assertEquals will compare the return value of the method call with the expected value, which you don't want, and of course, there will be no return value if the expected exception is expected. Move assertEquals to the 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()); } } 
+4
source

Works great for me.

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

if assertEquals fails ComparisonFailure will handle it

+1
source

Java 8 solution

Here is the utility function I wrote:

 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 )

Use it as follows:

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

Also, if you want to read some reasons why you should not want assertTrue so that the message of your exception is equal to a specific value, see this: https://softwareengineering.stackexchange.com/a/278958/41811

0
source

This is a good library that allows you to state exceptions in their purest form.

Example:

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

Source: https://habr.com/ru/post/913165/


All Articles