Java JUnit/TestNg:如何简化/组合同一异常的多个{try fail()catch}?

Java JUnit/TestNg:如何简化/组合同一异常的多个{try fail()catch}?,java,unit-testing,junit,testng,Java,Unit Testing,Junit,Testng,示例(断言1和断言2的相同): @junit.framework.Test//或@org.testng.annotations.Test 公共无效测试用例(){ 试一试{ //断言1 失败(); }捕获(){ } 试一试{ //断言2 失败(); }捕获(){ } } 如果很难将其分解为单独的测试方法,下面是过去对我有效的方法 创建一个方法expectsException(),该方法需要回调 interface Callback { void call() throws Exceptio

示例(
断言1
断言2
相同):

@junit.framework.Test//或@org.testng.annotations.Test
公共无效测试用例(){
试一试{
//断言1
失败();
}捕获(){
}
试一试{
//断言2
失败();
}捕获(){
}
}

如果很难将其分解为单独的测试方法,下面是过去对我有效的方法

创建一个方法
expectsException()
,该方法需要
回调

interface Callback {
    void call() throws Exception;
}

void expectsException(Callback callback) {
    try {
        callback.call();
        fail("ExpectedException was not thrown!");
    } catch (Exception e) {
        if (!(e instanceof ExpectedException)) {
            fail("Expecting ExpectedException, got " + e.getClass());
        }
        assertEquals("Expected exception message", e.getMessage());
    }
}
然后,将代码包装在
回调中的
try{…}catch
块中:

@Test
public void testSomething() {
    expectsException(new Callback() {
        public void call() throws Exception {
            // assert 1
        }
    });

    expectsException(new Callback() {
        public void call() throws Exception {
            // assert 2
        }
    });
}
但是请注意,根据您在
catch
块中所做的操作,这可能会或可能不会比直接的
try{…}catch
更详细


(当Java获得适当的闭包时,这种方法将更有意义。)

如果很难将其分解为单独的测试方法,那么下面是过去对我有效的方法

创建一个方法
expectsException()
,该方法需要
回调

interface Callback {
    void call() throws Exception;
}

void expectsException(Callback callback) {
    try {
        callback.call();
        fail("ExpectedException was not thrown!");
    } catch (Exception e) {
        if (!(e instanceof ExpectedException)) {
            fail("Expecting ExpectedException, got " + e.getClass());
        }
        assertEquals("Expected exception message", e.getMessage());
    }
}
然后,将代码包装在
回调中的
try{…}catch
块中:

@Test
public void testSomething() {
    expectsException(new Callback() {
        public void call() throws Exception {
            // assert 1
        }
    });

    expectsException(new Callback() {
        public void call() throws Exception {
            // assert 2
        }
    });
}
但是请注意,根据您在
catch
块中所做的操作,这可能会或可能不会比直接的
try{…}catch
更详细


(当Java获得适当的闭包时,这种方法将更有意义。)

您可能应该将您的方法分成两个单独的方法,每个方法将抛出:

@Test(expectedExceptions = NullPointerException.class)
public void testCase1() {
  // assert 1
}


@Test(expectedExceptions = NullPointerException.class)
public void testCase2() {
  // assert 2
}

您可能应该将方法分成两个单独的方法,每个方法都会抛出:

@Test(expectedExceptions = NullPointerException.class)
public void testCase1() {
  // assert 1
}


@Test(expectedExceptions = NullPointerException.class)
public void testCase2() {
  // assert 2
}

如果您有冒险精神,也可以尝试assertThrows:


如果您有任何问题,请随时询问。

如果您喜欢冒险,您也可以尝试assertThrows:

如果您有任何问题,请随时询问。

可能有帮助:

public void testCase() {
    // assert 1
    verifyException(obj, MyException.class).do(1);
    // assert 2
    verifyException(obj, MyException.class).do(2);
}
可能有助于:

public void testCase() {
    // assert 1
    verifyException(obj, MyException.class).do(1);
    // assert 2
    verifyException(obj, MyException.class).do(2);
}

如果我正确读取了您的意图,
try{…}catch
中的每个块都应该抛出
ExpectedException
(否则,这就是测试失败)。将此测试分解为多个方法,每个方法都用
@test(expected=ExpectedException.class)
注释是否太难?@Cedric&AlistairIsrael:谢谢您的回答。但是我希望有一种更简单的方法。如果我正确地阅读了您的意图,那么
try{…}catch
中的每个块都应该抛出
ExpectedException
(否则,这就是测试失败)。将此测试分解为多个方法,每个方法都用
@test(expected=ExpectedException.class)
注释是否太难?@Cedric&AlistairIsrael:谢谢您的回答。但我希望有一个更简单的方法。太好了!谢谢你的努力,太好了!谢谢你的努力。