2009-08-21 118 views
3

我有一个NetBeans项目,在一个单独的测试文件夹中设置了一堆源类和大约10个jUnit测试类。Netbeans - 源类无法访问测试类?

从测试文件中,我可以导入任何其他测试文件或源类。但是,从正常的源文件中,NetBeans的行为就好像Test类不存在一样。自动完成对他们将无法正常工作,如果我尝试使用它们,我会得到一个编译错误。

我明白通常使用常规源代码中的Test类是没有意义的,但在这种情况下我有一个很好的理由。我的部分程序接受一个类名作为字符串,并用反射来创建它的实例。我的一个jUnit测试调用这个方法来测试它,并将它传递给一个Test类的名字。这总是失败,因为正常的程序代码无法从Test文件夹中找到任何类。

+0

你能张贴堆栈跟踪?也许真正的问题是你传入的类名中的拼写错误?我希望它们能够在运行时在同一个类路径中运行,所以应该可以通过反射回溯到测试类。我想知道这里是否还有别的东西在发生。 – jsight 2009-08-21 02:29:29

回答

2

运行测试时,类路径将包含源类和测试类。他们必须,而且我认为实际上不可能在运行时阻止其他人访问对方,即使是类加载器也是如此。我当然非常怀疑Netbeans是否正在这样做,即使它在理论上是可能的。

有两种可能性,我可以猜测。一个是,错误不是你认为的那样。如果您发布堆栈跟踪,我们可以帮助您。

另一个是你使用错误的类加载器来加载类(即不只是使用Class.forName())。你可以发布代码snippit做类加载吗?

6

我不确定这是否会成为大多数人的意见,但这里是我的看法:如果您的程序因为无法从源代码类访问测试类而失败,那么您做错了事。我不在乎你是否认为你有一个很好的理由,你不知道。 (好吧认为你不这样做。)

也许你需要将测试类移入项目本身。或者在你的情况下,你可能需要配置类路径进行测试......我无法确定如何建议在不访问代码的情况下解决问题。从源类的角度来看,测试类似乎不应该存在,除非项目正在测试。

+0

我想我并不完全清楚。测试过程中出现此问题。我有一个jUnit测试,它正在测试基于作为字符串传递的类名实例化类的方法。我希望它在测试过程中实例化的类是另一个Test类,它不应包含在常规源中。 – takteek 2009-08-21 02:21:03

+0

同意。如果你使用反射来访问类,那么你应该没有具体的引用你加载的任何类,在这种情况下,你不应该得到一个编译错误,你应该得到一个运行时错误。 – Zoidberg 2009-08-21 02:21:46

+0

这是同意大卫...... – Zoidberg 2009-08-21 02:22:28

0

我遇到了一个非常类似的问题,最终发现在Test文件夹下实现的模拟对象根本就没有被编译,因为我从来没有直接实例化它们。换句话说,我的代码将无法在这里:

Class gatewayClass = Class.forName(System.getProperty("com.ov.MockGateway")); 

即使我有test/com/ov/MockGateway.java设置正确。由于我没有明确创建MockGateway的实例,因此NetBeans有意跳过编译它。如果我手动编译文件,通过从Projects视图中选择并按F9,然后我的测试运行得很好。

我的工作,周围是下面的代码添加到我的单元测试,迫使NetBeans的编译模拟对象类:

​​