junit testing - assertEquals for exception

后端 未结 5 892

How can I use assertEquals to see if the exception message is correct? The test passes but I don\'t know if it hits the correct error or not.

The test I am running.

相关标签:
5条回答
  • 2021-02-08 16:46

    Java 8 solution

    Here is a utility function that 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 would like to read some reasons why you should not want to assertTrue that the message of your exception is equal to a particular value, see this: https://softwareengineering.stackexchange.com/a/278958/41811

    0 讨论(0)
  • 2021-02-08 16:47
    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() );
    }   
    
    0 讨论(0)
  • 2021-02-08 16:55

    This is nice library that allows asserting exceptions in a clean way.

    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 讨论(0)
  • 2021-02-08 16:57

    The assertEquals in your example would be comparing the return value of the method call to the expected value, which isn't what you want, and of course there isn't going to be a return value if the expected exception occurs. Move the 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());
        }        
    }
    
    0 讨论(0)
  • 2021-02-08 17:01

    Works perfectly 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

    0 讨论(0)
提交回复
热议问题