2014-11-05 41 views
1

我为我的应用程序创建了多个测试用例,所有这些测试用例都链接在一个测试套件类中。JUnit 4:测试用例返回测试套件中其他测试中使用的对象

但是,我想将第一个测试中创建的对象传递给其他人。

为了更清楚起见,第一个测试测试了一个类,该类使用来自我的数据库的数据创建了一个复杂的对象。我希望其他人测试对象本身的方法。

这是我如何定义我的测试套件类:

package tests.testSuites; 

import tests.Test1; 
import tests.Test2; 
import org.junit.runner.RunWith; 
import org.junit.runners.Suite; 
import org.junit.runners.Suite.SuiteClasses; 

@RunWith(Suite.class) 
@SuiteClasses({ 
    Test1.class 
    Test2.class 
}) 
public class DataTestSuite {  
} 

不过,我想有这样的地方:

MyObject obj=Test1.testcreation(); 
Test2.testMethod(obj); 

我如何可以结合一个普通的JUnit TestSuite类的定义与是否需要将创建的对象传递给我的其他测试?

编辑

的信息,测试套件是在测试运行器类推出。该类有助于格式化结果并创建自定义日志文件。

这是怎么调用的测试套件:

public class MetExploreTestRunner { 

    public static void main(String[] args) { 

     Result result=JUnitCore.runClasses(DataTestSuite.class); 
     if(result.wasSuccessful()){ 
      System.out.println("All tests succesful "); 
     }else{ 
      for(Failure failure:result.getFailures()){ 
       System.out.println(failure.toString()); 
      } 

     } 

    } 
} 
+1

也许你应该尝试使用@Parametrized注释 - http://junit.sourceforge.net/javadoc/org/junit/runners/Parameterized.html? – BlueLettuce16 2014-11-05 09:33:04

+2

如果您不重新创建用于测试每个测试的对象,那么创建依赖于顺序的测试(因为之前的测试可能已改变对象的状态)会有风险。更好地为我相信的每个测试创建测试对象。 – 2014-11-05 09:34:32

+0

@ErwinBolwidt:这很好。在这种情况下,应该使用注解来创建对象。但是,如果您从数据库获取对象,则不再是单元测试,而是集成测试。 – BlueLettuce16 2014-11-05 09:35:40

回答

1

经过在互联网上搜索了很多,我发现我在找什么。

库JExample允许您创建不同测试之间的依赖关系,并在它们之间传递我所需要的参数。 http://scg.unibe.ch/research/jexample

我真的推荐它。

谢谢大家对你的答案

1

不要那样做。每个测试都应该独立于其他测试。然后您可以单独运行测试,进行调试,并且每个测试都更易于理解。此外,JUnit以任意顺序运行测试;您不能保证该对象在使用之前将被创建。

如果有多个测试使用类似的对象,请考虑将代码创建为测试类的共享私有方法。如果许多测试使用该对象,请考虑将其设置为由@before方法设置的测试夹具。

0

您可以使用@Rule,而不是将一些数据从一个测试重用到其他测试。您可以在此处看到一个示例:https://github.com/junit-team/junit/wiki/Rules

该规则可以创建该大对象,然后您可以在每个想要的测试中使用该对象。

我不建议您在测试之间创建任何依赖关系,因为事情未来可能会发生变化,您必须在其他测试中更改很多内容。

如果你真的想这样做,你说什么,有一个注释@DependsOn这将是有用的,你

0

看来你在做集成测试,而不是单元测试。

你可以做的是:

  1. 创建连接到数据库,并创建这个复杂的对象
  2. 写一个新的类,将运行所有测试,将创建一个实例模拟类的模拟类(这可能是有帮助的http://www.tutorialspoint.com/junit/junit_suite_test.htm
  3. 使用@BeforeClass注释创建方法将获得此对象。
  4. 运行你的测试。

我的观点是它不是很实用,而不是单元测试。单元测试应该是独立的,不要依赖其他测试。

+0

我实际上有一个testrunner类,它启动测试套件并将结果记录在适当的文件中,但我不知道如何将创建的对象传递给runner中的测试类。 – Ben 2014-11-05 10:22:18

0

为什么不把MyObject的创建分解成实用程序类?

public class Test2{ 
    ... 
    @Test 
    public void testMethod(){ 
     MyObject obj = TestUtil.createMyObject(); 

     //do test here 

    } 


} 

然后,您可以从任何测试中致电TestUtil.createMyObject()。另外,如果创建MyObject代价昂贵,则可以懒洋洋地创建它并缓存结果,或者使用对工厂方法有用的其他任何模式。