我应该在junit库中断言或抛出异常吗?

时间:2015-11-27 10:40:53

标签: java junit

我正在编写一个java库来轻松编写一些junit测试。我不知道我是否必须在我的库中断言或抛出异常。这是一个例子。假设我在我的库中定义了这个函数来检查类

的方法数
public void assertNumberOfMethods(Class clazz, int expectedNumberOfMethods) {
     int numberOfMethods = clazz.getDeclaredMethods().length;
     //TODO compare number and expected number
}

我应该

  1. 在我的库中直接断言

    Assert.assertTrue(expectedNumberofMethod > 0); 
    Assert.assertEquals(numberOfMethods,expectedNumberOfMethods);
    //...
    
  2. 抛出异常让用户处理此异常。由于此库旨在用于单元测试,因此用户可以使用@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(/*...*/);
    }
    
  3. 编辑这是一个虚拟示例

4 个答案:

答案 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被抛出,但你正在做一些不同的事情。