从Eclipse中的依赖jar运行JUnit测试

时间:2012-08-29 10:26:22

标签: java eclipse unit-testing maven junit

我有一些JUnit测试包含在.jar中,旨在用作库。该库包含一些测试,只要在另一个项目中使用该库,就应该运行这些测试。

然而,当我使用库创建一个新项目并在Eclipse中运行JUnit时,依赖项.jar中的测试不会被JUnit测试运行器检测到/不会被检测到。我收到了消息:

No tests found with test runner 'JUnit 4'.

有没有办法可以配置依赖项.jar,以便测试可以与主项目中可能包含的任何测试一起运行?

基本上我希望依赖项.jar将测试“导出”到它所使用的任何项目中。

我正在使用Eclipse Juno,JUnit 4.10和Maven进行依赖管理。

修改

这个库的重点是能够帮助测试使用它的项目 - 即它运行一些专门的测试。这就是为什么我希望能够导入库.jar并让它为导入项目提供额外的测试。

4 个答案:

答案 0 :(得分:4)

您可以尝试 Maven Surefire

在某些情况下,拥有一组使用各种依赖关系配置运行的测试会很有用。实现此目标的一种方法是使用包含单元测试的单个项目并生成测试jar。然后,几个测试配置项目可以使用单元测试并使用不同的依赖集运行它们。问题是没有简单的方法在依赖jar中运行测试。 Surefire 插件应该有一个配置,允许我运行依赖jar中包含的全部或一组单元测试。

这可以按照以下方式完成( Junit 3 ):

确保测试jar包含一个具有静态suite()方法的类

import junit.framework.Test;
import junit.framework.TestSuite;

public class AllTests {    
    public static Test suite() 
    { 
        TestSuite suite = new TestSuite( "All Tests"); 
        suite.addTestSuite(TestOne.class); 
        suite.addTestSuite(TestTwo.class); 
        return suite; 
    }    
}

然后在使用test-jar依赖项的项目中: 创建 TestCase

package org.melati.example.contacts;
import org.melati.poem.AllExportedTests;
import junit.framework.Test;
import junit.framework.TestCase;

public class PoemTest extends TestCase {    
    public static Test suite() 
    { 
        return AllExportedTests.suite(); 
    }
}

现在可以找到测试。

答案 1 :(得分:2)

我认为制作单元测试库(@Test注释方法)是一个坏主意。但是,制作可重复使用的测试组件库是一个很好的选择。我们已经在一些开源项目中完成了这项工作,你可以看看它是如何工作的。

  1. 一个Maven模块从src/mock/java目录导出测试组件(我们称之为“模拟”)。导出的工件具有-mock分类器。请参阅rexsl/pom.xml(注意突出显示的行)。

  2. 模拟工件正在部署到Maven Central,并附带通常的工件:http://repo1.maven.org/maven2/com/rexsl/rexsl-core/0.3.8/(注意...-mock.jar个文件)

  3. 需要该模拟的模块可以将它们包含为通常的工件,例如rexsl-core/pom.xml(参见突出显示的行):

  4. 然后,在您的单元测试中,只使用模拟库中的类,例如模拟的常规构建器,例如:BulkHttpFeederTest

  5. 这就是如何以优雅的方式使您的测试工件可重用。希望它有所帮助。

答案 2 :(得分:1)

@Mikera,

我发现这可能会对你有所帮助。只需将Testcase类扩展到项目中的一个java类,就可以运行该特定类将其作为JUnit Test运行。

答案 3 :(得分:1)

我不确定这是否可取 - 一方面,如果您使用jar,其行为可能会受到外部环境的影响,例如:类路径中的其他库。从jar内部,没有简单的方法来分析这个上下文并相应地调整测试。另一方面,如果您编写并编译库,则应在将其打包为jar之前对其进行测试。您甚至可能不想包含测试。

如果再次运行测试对你来说真的很重要,我会感兴趣的是如果不改变jar就会失败。但是,在这种情况下,您可能希望扩展testrunner。据我所知,它使用反射。您可以非常轻松地在类加载器中加载jar并遍历所有类。通过反射,您可以识别测试类并组装测试套件。您可以查看testrunner的示例。不过,您需要从外部开始此过程,例如来自客户端项目中的一个测试类。在这里,QATest的方法可能会有所帮助:通过提供overrideuite或testrunner的覆盖版本,您可以自动执行此操作 - 如果客户端使用被覆盖的API。

让我知道这种相当昂贵的方法是否适用于您的场景,我可以提供代码示例。