Java JUnit4:测试用例返回测试套件中其他测试中使用的对象

Java JUnit4:测试用例返回测试套件中其他测试中使用的对象,java,unit-testing,junit,Java,Unit Testing,Junit,我已经为我的应用程序创建了几个测试用例,所有这些都链接在一个测试套件类中 但是,我希望将在第一个测试中创建的对象传递给其他对象 更清楚地说,第一个测试测试一个类,该类使用来自数据库的数据创建复杂对象。我希望其他人测试对象本身的方法 以下是我如何定义我的测试套件类: package tests.testSuites; import tests.Test1; import tests.Test2; import org.junit.runner.RunWith; import org.junit.

我已经为我的应用程序创建了几个测试用例,所有这些都链接在一个测试套件类中

但是,我希望将在第一个测试中创建的对象传递给其他对象

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

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

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());
            }

        }

    }
}

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


如果几个测试使用类似的对象,请考虑将代码创建为测试类的共享私有方法。如果许多测试使用该对象,考虑将它设为一个由“以前方法”设置的测试夹具。

< P>可以使用@规则,而不是将一个测试中的一些数据重用到其他测试中。您可以在此处看到一个使用示例:

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

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


如果你真的想做你所说的,有一个注释@dependsOn对你很有用

你似乎在做集成测试而不是单元测试

您可以做的是:

  • 创建连接到数据库并创建此复杂对象的模拟类
  • 编写一个新类,该类将运行所有测试,并将创建模拟类的实例(这可能会很有帮助)
  • 创建带有@BeforeClass注释的方法以获取此对象
  • 运行您的测试

  • 在我看来,它不是很实用,而且根本不是单元测试。单元测试应该是独立的,不依赖于其他测试

    为什么不将创建
    MyObject
    的工作分解到实用程序类中呢

     public class Test2{
        ...
        @Test
        public void testMethod(){
            MyObject obj = TestUtil.createMyObject();
    
            //do test here
    
        }
    
    
     }
    

    然后可以从任何测试调用
    TestUtil.createMyObject()
    。另外,如果创建
    MyObject
    的成本很高,您可以懒散地创建它并缓存结果,或者使用对工厂方法有用的任何其他模式。

    在internet上进行了大量搜索后,我找到了我要找的内容

    库JExample允许您在不同的测试之间创建依赖关系,并在它们之间传递参数,这正是我所需要的

    我真的推荐它


    感谢大家的回答

    也许您应该尝试使用@Parameterized annotation-?如果您不重新创建用于测试每个测试的对象,则创建顺序相关测试会有风险(因为之前的测试可能已更改对象的状态)。最好为我相信的每个测试创建测试对象。@ErwinBolwidt:这是一个很好的观点。在这种情况下,应在注释之前使用创建对象。但是,如果您从数据库获取对象,那么它不再是单元测试,而是集成测试。我已经研究了@Parameterized注释,但我没有发现它对这个问题有真正的帮助,因为它在测试用例类中使用,而不是在测试套件类中使用。如果可以在测试套件中使用,我没有找到任何关于它的文档。对于数据库,它实际上是我们数据库的副本,仅用于测试和存储测试数据。我实际上有一个testrunner类,它启动测试套件并将结果记录在适当的文件中,但我不知道如何将创建的对象传递给runner中的测试类。