Java JUnit - 是否可以确定是否&抛出哪个异常?

时间:2014-05-23 12:09:38

标签: java unit-testing exception junit try-catch

我在普通班级中有一个方法,其中try有多个catches

Object returnObject = null;
try {
    // do some stuff to set returnObject
}
catch (NoSuchMethodException ex) {
    ex.printStackTrace();
}
catch (InstantiationException ex) {
    ex.printStackTrace();
}
catch (IllegalAccessException ex) {
    ex.printStackTrace();
}
catch (IllegalArgumentException ex) {
    ex.printStackTrace();
}
catch (InvocationTargetException ex) {
    ex.printStackTrace();
}
return returnObject;

在我的UnitTest中,我想测试该方法是否成功通过了try中的内容,而没有进入caught Exceptions之一。

我知道如果我的普通课程方法中没有try-catch,我可以使用try-catch Assert.fail(...);ExpectedException-tag测试方法的前面。

但是,我的方法确实有一个try-catch,如果我成功通过UnitTest,我想要try,而不是去catches之一。 (正如您在上面的代码中看到的,我的所有catches只有ex.printStackTrace();

PS:我也无法使用try中的内容进行测试。因此,我无法在方法后检查returnObject是否为null,因为在这种情况下,我希望它为null(但不会转到catch)。否则我不会问这个问题。

提前感谢您的回复。

4 个答案:

答案 0 :(得分:0)

我认为您的单元测试不必知道异常是否被抛出并在方法内捕获。您的单元测试应该测试您的方法的合同。它不应该关注这个合同是如何实施的。因此,如果方法的合同返回null,如果发生了一些不好的事情,那就可以了,然后以这种方式测试它。如果调用者在方法执行和异常类型时应该知道异常,那么你可以使用方法hasException()返回一些包装器对象;

答案 1 :(得分:0)

您可以在全局String变量中指定异常名称(使用global - 因为您已经返回了一个对象),并比较assert语句中的字符串。如果没有异常情况,返回的字符串将为空。

public static String message="";  // global variable

Object returnObject = null;
try {
    // do some stuff to set returnObject
}
catch (NoSuchMethodException ex) {
    message=ex.getMessage();
    ex.printStackTrace();
}
catch (InstantiationException ex) {
    message=ex.getMessage();
    ex.printStackTrace();
}
catch (IllegalAccessException ex) {
    message=ex.getMessage();
    ex.printStackTrace();
}
catch (IllegalArgumentException ex) {
    message=ex.getMessage();
    ex.printStackTrace();
}
catch (InvocationTargetException ex) {
    message=ex.getMessage();
    ex.printStackTrace();
}
return returnObject;

断言 -

assertEquals(ClassName.message.equalsIgnoreCase(""),true);

答案 2 :(得分:0)

您可以访问JVM输出流。我们使用遗留代码执行此操作,但遗憾的是,它不使用记录器,而是将所有信息打印到 System.out

为了演示,如果构造函数中传递了null,请查看抛出给定异常或无异常的类。抛出的异常将被处理并打印到System.out,就像你在问题中解释的那样。

public class SystemOutClass {

    private Exception exception;

    public SystemOutClass(Exception exception) {
        super();
        this.exception = exception;
    }

    public Object doStuff() {
        Object returnObject = null;
        try {
            doThrowException();
        } catch (NoSuchMethodException ex) {
            ex.printStackTrace();
        } catch (InstantiationException ex) {
            ex.printStackTrace();
        } catch (IllegalAccessException ex) {
            ex.printStackTrace();
        } catch (IllegalArgumentException ex) {
            ex.printStackTrace();
        } catch (InvocationTargetException ex) {
            ex.printStackTrace();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return returnObject;
    }

    private void doThrowException() throws NoSuchMethodException, 
    InstantiationException, IllegalAccessException, InvocationTargetException,
    Exception {
        if (exception != null) {
            throw exception;
        }
    }
}

相应测试会将System.out切换到已知的ByteArrayOutputStream,然后可以检查某些内容。

public class SystemOutTest {

    private PrintStream defaultOutStream;

    private ByteArrayOutputStream outStream;

    @Before
    public void setupStandardOutStream() {
        outStream = new ByteArrayOutputStream();
        defaultOutStream = System.out;
        System.setOut(new PrintStream(outStream));
    }

    @After
    public void cleanUpOutStream() {
        System.setOut(defaultOutStream);
    }

    private String getConsoleOutput() {
        return outStream.toString();
    }


    @Test
    public void handleNoSuchMethodException() {
        // given
        SystemOutClass handlingClass = new SystemOutClass(new NoSuchMethodException());

        // when
        handlingClass.doStuff();

        // then
        getConsoleOutput().contains("java.lang.NoSuchMethodException");
    }

}

答案 3 :(得分:0)

如果您有一个方法的特定部分,您希望单独进行测试,请相应地重构您的课程:

Object doSomeStuffAndPossiblyFail()
{
    Object returnObject = null;
    // do some stuff to set returnObject
    return returnObject;
}

Object doSomeStuffAndReportFailureAsNull()
{
    Object returnObject = null;
    try {
        returnObject = doSomeStuffAndPossiblyFail();
    }
    catch (NoSuchMethodException ex) {
        ex.printStackTrace();
    }
    catch (InstantiationException ex) {
        ex.printStackTrace();
    }
    ....
    return returnObject;
}

您现在可以自由地测试doSomeStuffAndPossiblyFail完成而不会抛出任何例外。