试验。我真的需要添加“抛出异常”吗?

时间:2014-05-05 14:19:39

标签: java unit-testing testng

我看到人们使用"抛出异常"在测试中,但我从来没有。我应该担心吗?我从来没有遇到任何问题。有什么区别?

@Test()
public void test() throws Exception
{
        //Do something
}

@Test()
public void test()
{
        //Do something
}

3 个答案:

答案 0 :(得分:5)

如果您正在测试的代码抛出异常,则必须以某种方式处理它。通过声明"抛出异常"在方法签名中,或使用try-catch。

如果您在方法中调用的代码没有抛出任何异常,那么您不需要其中任何一个。如果您需要以某种方式捕获异常,编译器将通知您。

另请注意,您可以执行测试以确保抛出异常,请参阅this answer

答案 1 :(得分:3)

从功能上讲,没有区别。它只意味着如果抛出非RuntimeException,编译器不会抱怨。由于JUnit无论如何都会捕获测试方法引发的任何异常,因此它并不重要。 但是,通常认为自己捕获异常并使用JUnit的fail方法是更好的做法,在这种情况下,您不需要throws子句。

答案 2 :(得分:2)

会将测试标记为处于"错误状态"如果从该方法抛出异常。对于大多数用例,这与失败测试基本相同(在错误状态下完成的测试未成功的意义上)。很多测试作者都不喜欢与处理检查异常相关的麻烦(或代码丑化)。

,例如,考虑一个应该运行几个方法并断言对象的结束状态的测试:

public class SomeTest
    SomeObject so;

    @Before
    public void setUp() {
        so = new SomeObject();
    }

    @Test
    public void TestSomeFlow() {
        try {
            so.init();
        // must catch in order to avoid a compilation error
        } catch (InitExceptionIDontCareAbout e) {
            fail ("init failed");
        }

        try {
            so.doSomething();
        // must catch in order to avoid a compilation error
        } catch (SomeOtherExceptionIDontCareAbout e) {
            fail ("doSomething failed");
        }

        assertTrue ("doSomething didn't work", so.isSomethingDone());
    }
}

现在考虑代码在没有异常处理的情况下看起来更干净:

public class SomeTest
    SomeObject so;

    @Before
    public void setUp() {
        so = new SomeObject();
    }

    // Any exception throwm will mean the test did not succeed
    @Test
    public void TestSomeFlow() throws Exception {
        so.init();
        so.doSomething();

        assertTrue ("doSomething didn't work", so.isSomethingDone());
    }
}