通过junit测试主要方法

我写了一个类,它从main方法中获取控制台和参数的输入。 main方法为不同的控制台输入调用不同的方法,并为不同的参数调用不同的函数。 因此,我想通过模拟文件中的这些输入来使用Junit测试这个主要方法。 我该怎么做? 在junit中是否有任何特殊规定来测试class级的主要方法?

要提供文件的输入,请创建一个FileInputStream并将其设置为System.in流。 您可能希望在main方法完成后将原始设置恢复,以确保以后使用它的任何东西仍可正常工作(其他测试,JUnit本身……)

这是一个例子:

 @Test public void testMain() throws IOException { System.out.println("main"); String[] args = null; final InputStream original = System.in; final FileInputStream fips = new FileInputStream(new File("[path_to_file]")); System.setIn(fips); Main.main(args); System.setIn(original); } 

在您的实际代码中,您将需要处理任何IOExceptions并使用比文件的完整路径更好的东西(通过类加载器获取它),但这会给您一般的想法。

IMO测试主要方法的最佳方法是让主方法完全没有做任何事情,只需建立世界并开始它。 通过这种方式,一个简单的集成测试给出了“世界已经建立”的答案。

然后所有其他问题变得更容易回答。

main方法为不同的控制台输入调用不同的方法,并为不同的参数调用不同的函数。

它不应该,它应该调用someService.somemethod(args) 。 此服务与其他服务一样经过测试。

因此,我想通过模拟文件中的这些输入来使用Junit测试这个主要方法。 我该怎么做?

注入某种forms的假货或使用TemporaryFolder JUnit规则。

你可以从junit test调用main方法,如下所示:

 YourClass.main(new String[] {"arg1", "arg2", "arg3"}); 

但是由于main方法是void而且没有返回任何东西,你应该测试在主调用之后改变的对象;

这是链接如何测试不返回任何内容的方法?