在JUnit测试期间禁用Java程序的一部分

时间:2018-11-21 09:21:46

标签: java unit-testing testing junit

我正在用JUnit测试我的Java程序。 该程序包括一些JavaFX GUI界面和其他日志代码。但是,在测试期间,我不希望对它们进行测试。有什么方法可以在测试和开发之间切换代码?

描述可以是抽象的,我将使用一个示例:

public class Helloworld {

    /**
     * @param args the command line arguments
     */
    public static int greetingCnt = 0;

    public static void main(String[] args) {
        Helloworld helloword = new Helloworld();
        helloword.greetWorld();
        helloword.greetWorld();
        helloword.greetWorld();
        System.out.println("Greating count: " + greetingCnt);
    }

    public void greetWorld() {
        System.out.println("Hello World!");
        ++greetingCnt;
        //some other computation...
    }

}

在此示例中,如果我只想测试正确数量的greetingCnt,但又不想打印任何内容或执行任何额外的计算。但是在实际程序执行期间,对程序功能没有影响。我可以知道是否有办法吗?

谢谢!

3 个答案:

答案 0 :(得分:0)

没有你的额外努力是不可能的。

计算机根本无法分辨哪个计算会影响什么。

您可以通过替换默认的PrintWriter来关闭打印到控制台等特定功能,但是没有通用的解决方案。

答案 1 :(得分:0)

针对您的特定情况:您可以使用PowerMock in order to mock System.out,但是老实说,我忽略了它可能产生的全部副作用。


更笼统:您要查找的内容称为Mock object,并且基本上允许Object的实例不执行任何操作,这是运行代码的最低要求

对于您的情况,模拟System.out可以使您遍历对System.out.println()的调用,而无需实际调用。 因此,您的代码将像这样执行:

public class Helloworld {

/**
 * @param args the command line arguments
 */
public static int greetingCnt = 0;

public static void main(String[] args) {
    Helloworld helloword = new Helloworld();
    helloword.greetWorld();
    helloword.greetWorld();
    helloword.greetWorld();
    // System.out.println("Greating count: " + greetingCnt);
}

public void greetWorld() {
    // System.out.println("Hello World!");
    ++greetingCnt;
    //some other computation...
}

我可以进一步解释真正的发生方式,但是我想这足以满足您的答案。如果您好奇,可以查看测试的运行时执行情况,以检查模拟对象的真实类型。

答案 2 :(得分:0)

您首先需要使Java程序可配置。

一种方法是使用Java property files。然后,您可以使用特定的属性来禁用程序的某些部分。

在测试期间,您可以使用一个属性文件,而在正常执行期间可以使用另一个。

属性文件通常是Java类路径上的资源。然后,您可以使用包含描述测试配置的属性文件的类路径运行测试。