Java的。 ExpectedException导致错误

时间:2018-04-15 16:33:18

标签: java exception junit

设定:

  • java 1.8
  • JUnit 4.8.1

Java不是我的事。但我仍然在玩JUnit。 我希望写一个测试用例,结果是例外。

我跟着一些我发现没有运气的例子

import biblioteca.exception.InvalidAuthorException;
import biblioteca.util.Validator;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;

import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

/**
 *  Test
 */
public class MyTest  {
    @Rule
    public ExpectedException exception = ExpectedException.none();

    @Test
    public void testValidator()
    {
        assertTrue(Validator.isAlphaNumeric("A1"));
        assertFalse(Validator.isAlphaNumeric("><"));
        assertTrue(Validator.validateLength("vasile", 2, 64));
        assertFalse(Validator.validateLength("vasile", 24, 64));
        assertTrue(Validator.containsAtLeastOneLetter("1234a"));
        assertFalse(Validator.containsAtLeastOneLetter("1234"));
    }
    @Test
    public void testException() {
        Validator.validateAuthor("123");
        exception.expect(InvalidAuthorException.class);
    }
}

这种方法会抛出错误

enter image description here

这种方法不会产生预期的结果(我希望测试通过,因为我期待错误)enter image description here

我错过了什么?

1 个答案:

答案 0 :(得分:0)

你只需要颠倒

的顺序
   Validator.validateAuthor("123");

   exception.expect(InvalidAuthorException.class);

如果

Validator.validateAuthor("123");

抛出异常,你的测试函数(就像任何Java函数一样)会立即终止在那个未捕获的异常上,所以exception.expect永远不会发生。

编写期望异常的测试的另一种方法是这样的:

@Test
public void testException() {
    boolean exceptionOccurred = false;
    try 
     {
      Validator.validateAuthor("123");
     }
    catch( InvalidAuthorException e )
    {
      exceptionOccurred  = true;
    }
   Assert.assertTrue( "Error: Expected test to throw an InvalidAuthorException",exceptionOccurred );    
}

它更冗长,并且不太清楚测试是否为负测试,但它有一个重要的优点,例外不会终止测试功能,所以你可以做其他的事情比如记录和进一步检查故障状态,它是您检查实际异常消息的唯一方法,如下所示:

@Test
public void testException() {
    try 
     {
      Validator.validateAuthor("123");
      Assert.fail("Error: Expected to get an InvalidAuthorException");  // Necessary for failing the test if there is no exception. Without this the test will pass
     }
    catch( InvalidAuthorException e )
    {
       Assert.assertEquals("Bad Author", e.getMessage());     
    }
}

另一种方式,(在将规则引入JUnit之前)是这样的:

@Test( expected = InvalidAuthorException.class )
public void testException() {
      Validator.validateAuthor("123");
}

它很好,因为它非常简洁,并且很明显它是一个负面测试,如果没有异常发生将导致测试失败,并且会在异常发生时通过测试,但是你赢了# 39;能够在该测试函数中添加更多测试语句,因为异常再次终止了测试函数,因此无法检查异常消息。