Java junit无法捕获一般异常
java代码:Java junit无法捕获一般异常,java,exception,junit,Java,Exception,Junit,java代码: public static <T extends Throwable> void checkNotNull(Object value, String name, Class<T> exceptionClass) throws T, SecurityException, IllegalArgumentException, NoSuchMethodException, InstantiationException, IllegalAccessException
public static <T extends Throwable> void checkNotNull(Object value, String name, Class<T> exceptionClass) throws T, SecurityException, IllegalArgumentException, NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException {
if (value==null)
throw ExceptionHelper.constructException(exceptionClass, name + " should not be null");
}
static <T extends Throwable> T constructException(java.lang.Class<T> exceptionClass, String message) throws SecurityException, NoSuchMethodException, IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException {
Constructor<T> constructor = exceptionClass.getConstructor(String.class);
T result = constructor.newInstance(message);
return result;
}
然后编译器说:不能在catch块中使用类型参数T
那么如何解决这个问题呢
Constructor<T> constructor = exceptionClass.getConstructor(String.class);
T result = constructor.newInstance(message);
仍然T
是一种类型,而不是可以捕获的类,例如Exception
。正如您在错误中发现的,您将无法捕获类型
因为您知道,TypeT
表示扩展了Throwable
的类,use可能希望在catch块中使用Throwable
} catch (Throwable e) {
因为T在编译时是未知的,所以不能在这样的catch块中使用它。编译器根本不支持它,因此出现了错误 如果您的目的是验证抛出了正确的异常,我建议您修改测试代码,如下所示:
@Test
public void testCheckNotNull() {
try {
ValidationUtility.checkNotNull(null, "valuename", exceptionClass);
} catch (Throwable e) {
assertEquals(exceptionClass, e.getClass());
}
}
正如前面的回答中指定的,您无法捕获T。这是因为擦除。如果您期望出现异常,我建议使用JUnit4
@Test(expected = Throwable.class)
public void testCheckNotNull() throws Throwable {
ValidationUtility.checkNotNull(null, "valuename", exceptionClass);
}
您的测试代码也有一个bug。如果没有抛出异常,那么测试仍然会通过。你也需要有一个失败
@Test
public void testCheckNotNull() {
try {
ValidationUtility.checkNotNull(null, "valuename", exceptionClass);
fail("expected to throw")
} catch (Throwable e) {}
}
用Throwable替换T,因为您的类型参数可能没有在junit代码中声明。我还有一个问题。如何在调用ValidationUtility.checkNotNull(null,“valuename”,exceptionClass)时在测试用例中创建exceptionClass,因为exceptionClass类型是Class。只是“Class exceptionClass;”OK?通过声明
Class exceptionClass
,exceptionClass不能作为参数传递给checkNotNull
方法,因为它未初始化。如果您正在做其他事情来初始化它,请分享它是如何初始化的?我只是不知道如何初始化它,因为它的类型是java.lang.Class。这是我之前猜测的。您的异常类必须是从thowable
扩展而来的某个类,例如java.lang.NullPointerException
。在这种情况下,您可以调用checkNotNull
作为ValidationUtility.checkNotNull(null,“valuename”,java.lang.NullPointerException.class)代码>。非常感谢您的帮助。我知道怎么做。
@Test(expected = Throwable.class)
public void testCheckNotNull() throws Throwable {
ValidationUtility.checkNotNull(null, "valuename", exceptionClass);
}
@Test
public void testCheckNotNull() {
try {
ValidationUtility.checkNotNull(null, "valuename", exceptionClass);
fail("expected to throw")
} catch (Throwable e) {}
}