2017-02-23 48 views
0

我有一个非常简单的junit测试类,它可以在Eclipse JUnit启动器中成功运行。Maven构建失败,测试范围为junit

以下是JUnit的pom依赖项。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 

    ... 
<dependencies> 

    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-test</artifactId> 
     <version>${spring.version}</version> 
    </dependency> 

    <dependency> 
     <groupId>org.mockito</groupId> 
     <artifactId>mockito-all</artifactId> 
     <version>1.10.19</version> 
    </dependency> 

    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>4.12</version> 
     <scope>test</scope> 
    </dependency> 

    <dependency> 
     <groupId>org.hamcrest</groupId> 
     <artifactId>hamcrest-all</artifactId> 
     <version>1.3</version> 
     <scope>test</scope> 
    </dependency> 
... 
</dependencies> 

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-surefire-plugin</artifactId> 
      <version>2.19.1</version> 
     </plugin> 
    </plugins> 
</build> 

</project> 

但是,上运行Maven构建,我得到如下错误信息:

MyTest.java:[3,24] package org.junit does not exist 

而且,建立运行从JUnit的依赖移除<scope>test</scope>成功后。

为什么它在测试范围和如何解决它失败?

我正在使用Java 8和Maven 3.3.9版本。

编辑 - 最小的,完整的和可验证的代码添加

既然不能分享实际的代码,我创建了一个演示测试类,并得到下面的同样的错误。

/MyProject/demo/src/test/java/com/MyTest.java:[3,24] package org.junit does not exist 
/MyProject/demo/src/test/java/com/MyTest.java:[3,1] static import only from classes and interfaces 
/MyProject/demo/src/test/java/com/MyTest.java:[5,17] package org.junit does not exist 

MyTest的类:

package com; 

import static org.junit.Assert.assertEquals; 

import org.junit.Test; 

public class MyTest { 

    @Test 
    public void demo() throws Exception { 

     int expected = 10; 
     int actual = 10; 

     assertEquals(expected, actual); 
    } 
} 

而且,它是一个多模块项目。 JUnit依赖项在普通模块下,Test类在demo模块下。

的pom.xml在演示模块包括通用模块的依赖关系:

<dependencies> 

    <dependency> 
     <groupId>myproject</groupId> 
     <artifactId>common</artifactId> 
     <version>1.0</version> 
    </dependency> 

</dependencies> 

然而,构建复制MyTest的类通用模块后得到了成功。所以,通用模块中的junit依赖似乎不会导入到演示模块。

+4

测试应该放在'src/test/java'文件夹中,并且应该用'@ Test'注释。这是你的情况吗?如果没有,也许你可以提供完整的'pom.xml'文件和你的测试代码,以验证一切是否正常。 –

+1

如果BoniGarcía建议的不是您的问题,请提供更多信息。但是看起来你的POM和使用情况都不错,所以确实可能你没有使用src/test文件夹。 –

+0

我有src/test/java /文件夹下的测试类,并用@Test注解。我无法分享完整的代码,但会在一段时间内分享相关的代码。 –

回答

1

在Maven中,并非所有传递依赖(依赖关系的依赖)都被添加到类路径中 - 这取决于范围。如果传递依赖项是testprovided作用域,那么它们永远不会被添加到类路径中。这是有道理的,因为如果你添加一个lib到你的依赖关系,你不想依赖它的测试库。

请参阅Maven的Introduction to the Dependency Mechanism#Dependecy Scope,特别是该部分底部的表格。

所以解决的办法是添加junit依赖到你的目标模块(而不是你的公共模块)。或者将它添加到父项(这有点不好,因为不是每个模块都需要这个依赖项),这将有效地将它添加到所有的子项中。