我正在使用Maven和Eclipse(m2eclipse插件)开发一个项目。我遇到了JUnit测试的问题:
有时,在Eclipse中运行它们时,它们不会被编译,而是使用旧的类文件。当我删除类文件时,我在Eclipse中得到ClassNotFoundExceptions
。然后我必须使用mvn test-compile
或其他目标手动重新编译它们。
我还注意到,测试的类文件有时会放入classes
子目录而不是test-classes
。
我真的无法弄清楚出了什么问题。
JUnit java文件位于src/main/java
内且名称正确(*Test.java
)。
我是否必须始终通过Maven编译并运行它们?当我想运行它时,为什么Eclipse不编译文件? (有趣的是,有时确实如此。有时候一切都很完美。)
答案 0 :(得分:84)
我遇到了与STS Eclipse(Spring开发变体),m2e和JUnit相同的问题。解决方案是将src/test/java
的输出文件夹设置为target/test-classes
:
src/test/java
文件夹
target/test-classes
,点击 确定 现在,测试类中的更改已正确编译,您应该能够在Eclipse中运行JUnit测试。
问题是Eclipse将单元测试编译为默认输出文件夹target/classes
,而JUnit插件正确地尝试从test-classes
运行它们。
这个问题有几个重复:
答案 1 :(得分:5)
除了下面的答案
- 右键单击src / test / java文件夹
- 选择构建路径 - >配置输出文件夹
- 输入目标/测试类,单击“确定”
醇>
您应该检查以确保通过右键单击项目并转到属性 - >来正确设置构建器。助洗剂即可。如果您发现缺少构建器,则需要安装一个构建器。就我而言,maven项目有一个AspectJ依赖项,当我使用Maven Eclipse插件构建我的Eclipse项目时,默认情况下它正在寻找一个AspectJ构建器。我安装了AspectJ开发工具,它解决了这个问题。
希望这有帮助!
答案 2 :(得分:2)
另一点:JUnit测试类应该在src / test / java中,而不是src / main / java,否则Maven没能正确检测它们作为测试类,它们将包含在打包的jar中而不是测试罐。
答案 3 :(得分:2)
您遇到的问题最可能的解释是src/test/java
的输出文件夹未正确配置。
而不是fixing this configuration manually,您可以让m2eclipse为您修复此问题:只需右键单击该项目并选择 Maven>更新项目。
答案 4 :(得分:1)
我遇到了同样的问题。尝试上面配置输出文件夹和配置的建议Maven>更新项目但不起作用。最后我将testOutputDirectory改为“build / classes”,现在单元测试被拾取并执行。
终于找到了问题的原因。在我的pom中,我们还配置了maven编译器插件,如下所示
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
<outputDirectory>build/classes</outputDirectory>
</configuration>
</plugin>
不需要outputDirectory配置,这是导致上述问题的原因。删除此标记后,junits将被编译为构建&gt; testclasses文件夹,并且正在maven构建期间运行。 Yippee :)
答案 5 :(得分:1)
请检查您可以在其中配置的“testSourceDirectory”路径 pom.xml中。然后,将文件夹(在“testSourceDirectory”路径中配置)添加到eclipse构建路径。
请在下面的pom.xml中找到示例“testSourceDirectory”:
<build>
<testSourceDirectory>src/test/java</testSourceDirectory>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
答案 6 :(得分:1)
确保项目图标上有任何感叹号!在我的情况下,我忽略了有一个感叹号,如: exclamation point on project icon
打开“标记”视角,然后根据提示排除问题。 what the "Markers" perspective show
在我调用“mvn clean test”之后,junit测试类可以成功执行,因为它们不会引用在“Markers”透视图中警告的不可读jar。因此,很容易忽略它..
答案 7 :(得分:1)
对于从事java-scala mix项目的人,需要注意这一点。 即使以下面显示的方式进行配置,
<build>
<testOutputDirectory>${basedir}/target/test-classes</testOutputDirectory>
<plugins>
...
<plugin>
<groupId>net.alchim31.maven</groupId>
<artifactId>scala-maven-plugin</artifactId>
<version>3.3.2</version>
<configuration>
<testSourceDir>${basedir}/src/test/scala</testSourceDir>
<testOutputDir>${basedir}/target/test-classes</testOutputDir>
</configuration>
</plugin>
</plugins>
</build>
并做 Maven&gt;更新项目,eclipse尊重项目中src / test / java文件夹的输出目录,但不是src / test / scala文件夹。 (您可以通过右键单击特定的源文件夹并选择构建路径&gt;配置输出文件夹... 来解决这个问题,该文件应显示前一个案例的pom中指定的位置,但是,不适用于后一种情况。
这已经是使用scala与m2e的已知错误,如下所述:http://scala-ide.org/docs/tutorials/m2eclipse/
警告
截至2013年3月,一个错误会导致src / main / scala和src / test / scala使用默认输出文件夹(目标/类)。这可能会造成混乱&gt;在构建测试时,因为它们的类文件不会像在构建命令行时那样以目标/测试类结束。您可以通过手动更改src / test / scala的输出文件夹来解决此问题。
答案 8 :(得分:0)
Eclipse不希望其他任何东西与类文件混淆。它假设如果你没有在eclipse中编辑文件,它没有改变,也不需要编译。我认为问题源于eclipse和maven共享输出目录。我经常看到这个,如果我的mvn构建失败,它将删除类文件作为干净但未编译的新文件的一部分。我认为最好的解决方案是为mvn和eclipse设置单独的构建目录,但我从来没有考虑过这个问题。
答案 9 :(得分:0)
我的问题不是JUnit插件,而是pom.xml中的配置。
在查看了该问题的所有答案之后,@ Gulats的答案暗示我应该尝试在我的maven-compiler-plugin部分中设置一个class Parent extends Component<Props> {
constructor(props: Props) {
super(props);
this.state = {
data: {
image: null
}
};
}
public componentDidMount() {
const dataProvider = new DataProvider(DataProvider.DBNAME);
dataProvider
.loadData("somedoc")
.then((data: object) => this.setState({ data }));
}
public render() {
const { data }: any = this.stat;
if (data.image === null) {
return null;
}
return <Child image={data.image} />;
}
}
,并且达到了目的:
testOutputDirectory