9

如何使用 assertEquals 查看异常消息是否正确?测试通过了,但我不知道它是否遇到了正确的错误。

我正在运行的测试。

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

}

谢谢您的帮助。

4

5 回答 5

11
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() );
}   
于 2012-04-13T20:49:19.693 回答
5

您示例中的 assertEquals 会将方法调用的返回值与预期值进行比较,这不是您想要的,如果发生预期的异常,当然不会有返回值。将 assertEquals 移动到 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());
    }        
}
于 2012-04-13T20:49:58.053 回答
2

非常适合我。

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

如果 assertEquals 失败,ComparisonFailure 将处理它

于 2016-03-31T09:56:42.797 回答
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.
}

取自我的博客

按如下方式使用它:

@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

于 2015-12-18T18:47:27.353 回答
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();
于 2016-05-31T16:51:29.373 回答