Eclipse / Maven:JUnit测试在运行时未编译

时间:2011-05-22 11:41:25

标签: eclipse maven junit

我正在使用Maven和Eclipse(m2eclipse插件)开发一个项目。我遇到了JUnit测试的问题:

有时,在Eclipse中运行它们时,它们不会被编译,而是使用旧的类文件。当我删除类文件时,我在Eclipse中得到ClassNotFoundExceptions。然后我必须使用mvn test-compile或其他目标手动重新编译它们。

我还注意到,测试的类文件有时会放入classes子目录而不是test-classes

我真的无法弄清楚出了什么问题。

JUnit java文件位于src/main/java内且名称正确(*Test.java)。

我是否必须始终通过Maven编译并运行它们?当我想运行它时,为什么Eclipse不编译文件? (有趣的是,有时确实如此。有时候一切都很完美。)

10 个答案:

答案 0 :(得分:84)

我遇到了与STS Eclipse(Spring开发变体),m2e和JUnit相同的问题。解决方案是将src/test/java的输出文件夹设置为target/test-classes

  1. 右键单击Package Explorer
  2. 中的src/test/java文件夹
  3. 选择 构建路径 - > 配置输出文件夹
  4. 输入target/test-classes,点击 确定
  5. 现在,测试类中的更改已正确编译,您应该能够在Eclipse中运行JUnit测试。

    问题是Eclipse将单元测试编译为默认输出文件夹target/classes,而JUnit插件正确地尝试从test-classes运行它们。

    这个问题有几个重复:

答案 1 :(得分:5)

除了下面的答案

  
      
  1. 右键单击src / test / java文件夹
  2.   
  3. 选择构建路径 - >配置输出文件夹
  4.   
  5. 输入目标/测试类,单击“确定”
  6.   

您应该检查以确保通过右键单击项目并转到属性 - >来正确设置构建器。助洗剂即可。如果您发现缺少构建器,则需要安装一个构建器。就我而言,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