无法导入测试包



我试图将io.quarkus.test.*包导入到项目的src/main目录中的类中。但是IDE总是抱怨找不到这个包,即使它在那里(Ctrl+click(。此外,maven告诉";找不到符号";。

但是,当我将这个java文件移到src/test目录中时,IDE能够找到它,并且可以解决导入问题。

这种行为是怎么发生的?有人能向我解释一下吗?

要编译任何给定的源文件,javac首先需要关于它内部引用的所有各种类型的信息。即使是java.lang.String对java编译器来说也没有任何意义,除非它能找到资源java/lang/String.class,或者如果它有一个java源文件,它可以先编译,这样它就有了String.class文件。

幸运的是,java几乎在任何地方都有"引导类路径"(或者在更现代的版本中,引导模块(,这就是java.lang.String所在的位置。Java知道这个引导位置在哪里,并始终自动包含该批次。

但是,当编译器运行时,其余部分(如io.quarkus.test.stuff(必须位于类路径上或源路径上。

src/main源目录是用类路径和源路径上的各种内容编译的。

您的src/test目录以及所有配置为仅在测试配置中可用的依赖项都不在该路径中

这是经过设计的:你不想运送你的单元测试,因此在运送你的应用程序时,没有必要运送例如junit.jar和所有其他你只需要运行测试的东西。如果您的src/main代码意外引用了src/test中的一个文件或任何仅限测试的依赖项,而您的IDE只是将其正常挂起,那么您的机器上的一切都很正常,您将其发送到服务器(或者变成安装程序并发送给客户(,然后一切都失败了。

结论很简单:

  • 如果您想从主源树访问工具,访问当前仅配置为"测试"部署的东西,那么这就不再是测试部署,需要移动它。请注意,src/testdir通常可以访问所有主要需要的东西,除非您特意以一种非常奇怪的方式配置您的构建。因此,此举不会在您的测试代码中引发问题
  • 如果您在src/main中有一些代码只是真正需要进行测试,那么它应该在src/test