用junit测试main方法

use*_*152 22 java junit

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

G_H*_*G_H 14

要提供文件的输入,请创建一个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);
}
Run Code Online (Sandbox Code Playgroud)

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


Dav*_*dze 10

您可以像这样从 junit 测试调用 main 方法:

YourClass.main(new String[] {"arg1", "arg2", "arg3"});
Run Code Online (Sandbox Code Playgroud)

但是由于 main 方法是 void 并且不返回任何内容,因此您应该测试在 main 调用后更改的对象;

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


Mic*_*mlk 8

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

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

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

不应该,它应该打电话someService.somemethod(args).此服务与其他服务一样经过测试.

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

注入某种形式的假货或使用TemporaryFolder JUnit规则.

  • 虽然在这种情况下"正确的方式"可能不是"正确的方式",但我认为在答案列表中采用正确的方法很重要.如果一个新的开发人员在这个页面上发茬并看到"错误的方式"而没有任何指向"正确的方法",他们可能会错误地留下. (5认同)