设定:
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);
}
}
这种方法会抛出错误
这种方法不会产生预期的结果(我希望测试通过,因为我期待错误)
我错过了什么?
答案 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;能够在该测试函数中添加更多测试语句,因为异常再次终止了测试函数,因此无法检查异常消息。