我正在用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,但又不想打印任何内容或执行任何额外的计算。但是在实际程序执行期间,对程序功能没有影响。我可以知道是否有办法吗?
谢谢!
答案 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类路径上的资源。然后,您可以使用包含描述测试配置的属性文件的类路径运行测试。