我在普通班级中有一个方法,其中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
)。否则我不会问这个问题。
提前感谢您的回复。
答案 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
完成而不会抛出任何例外。