我在一个单独的 Test 文件夹中设置了一个包含大量源类和大约10个jUnit测试类的NetBeans项目。
在Test文件中,我可以导入任何其他测试文件或源类。但是,从普通源文件中,NetBeans就像测试类不存在一样。它们上的自动完成功能不起作用,如果我尝试使用它们,我会收到编译错误。
我理解通常使用常规源中的Test类是没有意义的,但在这种情况下我有充分的理由。我的程序的一部分接受一个类名作为字符串,并使用反射创建它的实例。我的一个jUnit测试调用此方法对其进行测试,并将其传递给Test类的名称。这总是失败,因为正常的程序代码找不到Test文件夹中的任何类。
答案 0 :(得分:6)
我不确定这是否会成为多数人的意见,但这是我的看法:如果您的程序失败,因为您无法从源类访问测试类,那么您做错了。我不在乎你认为你有充分的理由,你不这样做。 (好吧我认为你没有。)
也许您需要将测试类移动到项目中。或者在您的情况下,您可能需要配置类路径以进行测试......我无法明确地说明如何在不访问您的代码的情况下建议解决问题。从源类的角度来看,除非正在测试项目,否则测试类似乎不应该存在。
答案 1 :(得分:2)
在运行测试时,类路径将包含源类和测试类。它们必须,并且我认为即使使用类加载器也不可能阻止在运行时访问另一个。我当然非常怀疑Netbeans正在做这件事,即使它在理论上是可行的。
我猜有两种可能性。一个是错误不是你认为的错误。如果您发布堆栈跟踪,我们可以帮助您。
另一个是你使用错误的类加载器加载类(即不只是使用Class.forName())。你可以发布代码snippit进行类加载吗?
答案 2 :(得分:0)
我遇到了一个非常类似的问题,并最终发现在Test文件夹下实现的模拟对象根本没有被编译,因为我从未直接实例化它们。换句话说,我的代码在这里会失败:
Class gatewayClass = Class.forName(System.getProperty("com.ov.MockGateway"));
即使我已正确设置test/com/ov/MockGateway.java
。由于我没有明确创建MockGateway的实例,因此NetBeans有助于跳过编译它。如果我手动编译文件,通过从Projects视图中选择它并按F9,那么我的测试运行得很好。
我的解决方法是将以下代码添加到单元测试中,强制NetBeans编译模拟对象类:
public void doNothing() {
// Force the compiler to build MockGateway.class
// by including a do-nothing reference to it.
MockGateway mock = new MockGateway();
}