【问题标题】:Is it possible to have a main method with a @Before and @Test method in the same class? Java [duplicate]是否可以在同一个类中有一个带有 @Before 和 @Test 方法的 main 方法? Java [重复]
【发布时间】:2016-02-29 14:41:32
【问题描述】:

我想将命令行参数传递给带有 Junit 测试注释的 Java 类,这可能吗?

例子:

@Before
public void before(String a, String b) {
    // some processing
}

@Test
public void test() {

}

public static void main(String[] args) {

if (args[0] != null) 
    DEFAULT_CONTENT_DIR = args[0];

if (args[1] != null) 
    DEFAULT_FONTS_DIR = args[1];

if (args[2] != null) 
    formMLDir = args[2];

 before(DEFAULT_CONTENT_DIR, DEFAULT_FONTS_DIR);

}

这样的事情可能吗?

【问题讨论】:

  • 通常不会从main 方法调用单元测试方法,但也许如果你能解释你想要达到的目标,可能会有更好的方法来做到这一点。
  • 我想运行 2 个具有共生关系的类。类 1 生成输出文件,类 2 使用并验证它。所以我需要一个 before 方法来完成我的设置和一个单元测试方法来验证输出。我将这些作为 jars 部署在生产 Linux 环境中,因此测试数据会因盒子而异。所以我需要能够将命令行参数传递给 before 方法(运行 class1),以便它知道从哪里获取生产测试数据。我希望我提供了足够的背景
  • 老实说,我不认为这对 JUnit 来说是一个很好的用例。它是为单元测试而设计的,其中与外部类的关系要么非常简单,要么被模拟。我建议你看看集成测试框架。
  • 尝试为每种类型的配置创建不同的测试方法,以便测试所有 cinfigs。这样 yiu 就不需要 before 方法,并且您将获得可预测的结果。

标签: java junit conceptual


【解决方案1】:

可能吗?是的。你想要什么?应该不会吧。

public class CustomeMain {

    public static void main(String [] args) {
        customSetup(args);
        JUnitCore.main(new String [] {"SomeTest"});
    }

}

问题是几乎没有人真正自己调用 JUnit。他们使用 Ant、Maven、Eclipse 或其他一些构建工具。如果是这种情况,那么您的自定义 main 方法将不会被调用。

此外,尽管有上述 cmets,但这种类型的测试本质上并不是邪恶的,但如果可能的话,最好避免这种情况,但前提是您可以重写应用程序以避免复杂的交互。如果您无法重写交互,请不要跳过测试交互。如果有人让你伤心,请告诉他们这是一个集成测试,并且你正在使用 JUnit 作为集成测试框架。

可能对您来说最简单的解决方案是使用环境变量或 JVM 属性。任何半体面的构建工具都有办法让你提供它。摆脱 main 方法并将之前的方法更改为...

@Before
public void before() {
    String contentDir = System.getenv("CONTENT_DIR");
    if (contentDir == null) { 
        contentDir = DEFAULT_CONTENT_DIR;
    }

    //...
}

【讨论】:

    猜你喜欢
    • 2016-03-18
    • 1970-01-01
    • 1970-01-01
    • 2014-10-08
    • 1970-01-01
    • 2018-03-29
    • 2011-06-18
    • 1970-01-01
    • 2013-10-08
    相关资源
    最近更新 更多