我正在编写一个java库来轻松编写一些junit测试。我不知道我是否必须在我的库中断言或抛出异常。这是一个例子。假设我在我的库中定义了这个函数来检查类
的方法数public void assertNumberOfMethods(Class clazz, int expectedNumberOfMethods) {
int numberOfMethods = clazz.getDeclaredMethods().length;
//TODO compare number and expected number
}
我应该
在我的库中直接断言
Assert.assertTrue(expectedNumberofMethod > 0);
Assert.assertEquals(numberOfMethods,expectedNumberOfMethods);
//...
抛出异常让用户处理此异常。由于此库旨在用于单元测试,因此用户可以使用@Test(expected=SomeCustomException.class)
public void assertNumberOfMethods(Class clazz, int expectedNumberOfMethods) throws IllegalArgumentException, SomeCustomException {
if(expectedNumberOfMethods <= 0)
throw new IllegalArgumentException(/*...*/);
int numberOfMethods = clazz.getDeclaredMethods().length;
if(numberOfMethods != expectedNumberOfMethods)
throw new SomeCustomException(/*...*/);
}
编辑这是一个虚拟示例
答案 0 :(得分:4)
您计划创建专门的断言方法,就像编写Assert
类的扩展名一样。
为此,您应该像Assert
中的断言方法那样直接抛出断言错误(变体1),提供有用的错误消息。
在@Test
注释中指定预期异常的可能性有不同的用途。使用这个注释,Junit允许您测试一段代码抛出预期的异常,而不需要在测试代码中捕获异常。
答案 1 :(得分:2)
我会使用在fail()
库中几乎所有其他断言方法中使用的junit junit
方法
public void assertNumberOfMethods(Class clazz, int expectedNumberOfMethods) {
int numberOfMethods = clazz.getDeclaredMethods().length;
if (numberOfMethods != expectedNumberOfMethods) {
fail("some failing message);
}
}
答案 2 :(得分:1)
如果断言为假,则应抛出java.lang.AssertionError
异常。
另外,尽量不要重新发明轮子,看看AssertJ,它完全符合您的要求。
// Example
assertThat(clazz.getDeclaredMethods()).hasSize(5);
答案 3 :(得分:1)
expectedNumberofMethod > 0
应为IllegalArgumentException
。测试没有失败,方法调用不正确。
numberOfMethods == expectedNumberOfMethods
应该抛出一个java.lang.AssertionError
(或类似的),你如何做到这一点取决于你,你可以使用Assert.assertThat
,但它会将你绑定到一个测试框架。你可以直接扔它,但你必须做更多的手工工作。
如果您使用Assert.assertThat
,请记住第一个参数可以是String
描述出错的地方。用它。
不要使用自定义异常(不会扩展java.lang.AssertionError
),请考虑API的用户期望的内容,并执行此操作。每隔一个assert
导致java.lang.AssertionError
被抛出,但你正在做一些不同的事情。