测试一个方法,如果它在不调用它的情况下抛出异常

时间:2011-07-21 15:30:49

标签: java exception

如何在不调用的情况下测试给定方法是否会抛出异常(取决于传递的对象)?

例如:

public static boolean isAllowed(SomeObject obj)
{
    try
    {
        myMethod(obj);
        return true;
    }
    catch(Exception ex)
    {
        return false;
    }
}

但上面的方法将执行MyMethod(),我怎样才能在java中实现这个?

修改

实际上,我想这样做来验证文件名。看到这个:Validate a file name on Windows

7 个答案:

答案 0 :(得分:6)

正如其他人所说,通常无法判断是否会在没有实际计算的情况下根据输入抛出异常。 Java是完整的,因此可以简化为halting problem。但是,您可以在运行时找到方法可以抛出

的所有异常:

try {
    Method myMethod = this.getClass().getMethod("myMethod");
    System.out.println(Arrays.toString(myMethod.getExceptionTypes()));
} catch (NoSuchMethodException e) {}

答案 1 :(得分:3)

您可以提供一个兄弟方法isAllowed(),它明确地测试导致异常的条件。

存在错误风险。这两种方法需要保持同步导致异常的条件。但是,通常可以正确编写测试方法。

来自Joshua Bloch的“Effective Java”:

  

具有“状态相关”方法的类,只能在下面调用   某些不可预测的条件通常应该是单独的   “状态测试”方法,指示是否适合调用   依赖于状态的方法。

答案 2 :(得分:2)

在一般情况下,你不能。例如,所讨论的方法可能使用随机数生成器来决定是否抛出异常。或者对于更实际的示例,如果所讨论的方法试图打开文件,那么您无法事先知道其他某个进程是否可能在您尝试打开它之前删除该文件(这会导致异常)。 / p>

Java告诉你是否在编译时抛出异常(w / throws声明),但你无法确定它是否会在不执行它的情况下抛出异常。

答案 3 :(得分:1)

您无法在编译时知道该方法是否会在运行时抛出异常。

如果您想知道方法是否可以抛出异常;只是不要在try-catch块中包含该方法。像ecliple这样的编辑器会清楚地显示编译错误,如果该方法抛出异常。

这就是你想要的;或者我误解了你的问题。

答案 4 :(得分:1)

显然,如果您不想调用但需要在调用时理解行为,那么您需要读取方法字节代码。

另一个选择是提供一个mock-classloader并加载mock类(从而实现no-op方法实现)。

在一个功能齐全的世界中,上述将是一种合理的方法。鉴于它是Java,你如何保证和测量副作用的问题仍有待解决。也许上述内容适用于您的特定情况,但对于一般情况,您实际上要求对Java字节码进行静态分析,这可能是一个完整的研究领域。

答案 5 :(得分:1)

理解方法和有效参数比在调用之前盲目测试方法更好(这是不可能的)。

在将参数传递给方法之前验证它们。这是一个简单的例子,传递null会导致异常:

int getLength(String s)
{
  return s.length();
}

void someMethod()
{
  int len = -1;
  if (myString != null)
    len = getLength(myString);
}

答案 6 :(得分:0)

创建一个jUnit测试

http://www.junit.org/