我写了一个类,它从main方法中获取控制台和参数的输入。 main方法为不同的控制台输入调用不同的方法,并为不同的参数调用不同的函数。所以我想通过模拟文件中的这些输入来使用Junit测试这个主要方法。我该怎么做?在junit中是否有任何特殊规定来测试该类的主要方法?
答案 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而且没有返回任何东西,你应该测试在主调用之后改变的对象;