Netbeans - 源类无法访问测试类?

3

我有一个NetBeans项目,其中包含许多源代码类和大约10个jUnit测试类,它们位于单独的Test文件夹中。

从Test文件中,我可以导入任何其他测试文件或源代码类。然而,在普通的源代码文件中,NetBeans似乎不知道Test类的存在。自动补全不起作用,如果我尝试使用它们,就会出现编译错误。

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


你可以发一下堆栈跟踪吗?也许真正的问题在于你传递的类名中有错别字?我本来期望它们在运行时会在相同的类路径下运行,因此应该可以通过反射引用回测试类。我想知道这里是否还有其他问题。 - jsight
3个回答

6
我不确定这是否会成为大多数人的观点,但这是我的看法:如果您的程序因为无法从源类访问测试类而失败,那么您正在做错事。我不在乎您认为自己有一个很好的理由,您没有。(嗯,我认为您没有。)
也许您需要将测试类移动到项目中。或者在您的情况下,您可能需要配置测试的类路径... 没有访问您的代码,我不能确定如何建议解决这种情况。从源类的角度来看,测试类确实不应该存在,除非正在测试项目。

我想我没有完全清楚。这个问题确实发生在测试期间。我有一个 jUnit 测试,它测试一种根据作为字符串传递的类名实例化类的方法。我想要在测试期间实例化的类是另一个 Test 类,它不应该包含在常规源代码中。 - takteek
同意。如果你使用反射来访问类,那么你就不应该有任何对正在加载的类的具体引用,在这种情况下,你不应该得到编译错误,而应该得到运行时错误。 - Zoidberg
我没有它的引用。实际上,在编译时我没有任何错误。我只是用它作为一个例子来展示即使硬编码,测试类也无法被访问。 - takteek
1
@takteek:我理解你的情况。我认为你的问题没有用最好的方式表达(用 “源类不能访问测试类” 来命名会让我们想“好吧,这有什么问题?”)。我建议你专注于类加载器,特别是在运行测试期间为什么找不到你的测试类。 - David Z

2

在运行测试时,类路径将包括源和测试类。它们必须这样做,我认为在运行时防止一个类访问另一个类是不可能的,即使使用类加载器也无法实现。我确信Netbeans没有这样做,即使在理论上是可能的。

我猜测有两种可能性。一种是错误不是你所想的那样。如果你发布堆栈跟踪,我们可以帮你处理它。

另一种可能是你使用了错误的类加载器来加载该类(即不仅使用Class.forName())。你能发帖子放置加载类的代码片段吗?


0
我遇到了一个非常类似的问题,最终发现在测试文件夹下实现的模拟对象根本没有被编译,因为我从未直接实例化它们。换句话说,我的代码会在这里失败:
Class gatewayClass = Class.forName(System.getProperty("com.ov.MockGateway"));

尽管我已经正确设置了test/com/ov/MockGateway.java,但由于我没有显式地创建MockGateway的实例,NetBeans会帮忙跳过编译。如果我手动编译文件,通过从项目视图中选择它并按下F9键,那么我的测试就可以正常运行。

我的解决方法是在我的单元测试中添加以下代码,强制NetBeans编译模拟对象类:

public void doNothing() {
    // Force the compiler to build MockGateway.class
    // by including a do-nothing reference to it.
    MockGateway mock = new MockGateway();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接