用junit测试main方法

时间:2016-04-01 06:52:26

标签: java junit

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

3 个答案:

答案 0 :(得分:12)

要提供文件的输入,请创建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并使用比文件的完整路径更好的东西(通过类加载器获取它),但这会给您一般的想法。

答案 1 :(得分:8)

IMO测试主要方法的最佳方法是让主方法完全不做任何事情,只需设置世界并启动它。这样,一个简单的集成测试就会给出答案“已经建立了世界”。

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

  

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

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

  

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

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

答案 2 :(得分:3)

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

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

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

这是链接How do I test a method that doesn't return anything?