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

时间:2014-11-05 09:25:45

标签: java unit-testing 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());
            }

        }

    }
}

5 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

经过大量的互联网搜索后,我找到了我想要的东西。

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

我真的推荐它。

谢谢大家的回答

答案 2 :(得分:0)

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

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

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

如果你真的想做你说的话,那么@dependsOn会有一个对你有用的注释

答案 3 :(得分:0)

您似乎正在进行集成测试而不是单元测试。

你能做的是:

  1. 创建连接到数据库并创建此复杂对象的模拟类
  2. 编写一个将运行所有测试的新类,并创建一个mock类的实例(这可能是有帮助的http://www.tutorialspoint.com/junit/junit_suite_test.htm
  3. 使用@BeforeClass注释创建将获得此对象的方法。
  4. 运行测试。
  5. 就我而言,它不太实用,根本不是单元测试。单元测试应该是独立的,不要依赖其他测试。

答案 4 :(得分:0)

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

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

        //do test here

    }


 }

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