我在春天使用过junit测试集成测试和控制器测试,通常我们测试一个方法的输出但是当我试图在main方法中测试一个简单的hello world我不知道如何去做它所以会喜欢了解写什么
public class App
{
public static void main( String[] args )
{
System.out.println( "Hello World!" );
}
}
这是简单的java类,我知道如何测试它 我试着写这样的东西
public void mainMethodTest() throws Exception{
System.out.println("hello world");
String[] args = null;
Assert.assertEquals(System.out.println("hello world"),App.main(args));
}
答案 0 :(得分:5)
您可以为System.out
变量分配一个ByteArrayOutputStream
对象,您可以将该引用存储在变量中。
然后调用main()
方法并断言String
对象的ByteArrayOutputStream
内容包含预期的String
:
@Test
public void main() throws Exception{
PrintStream originalOut = System.out; // to have a way to undo the binding with your `ByteArrayOutputStream`
ByteArrayOutputStream bos = new ByteArrayOutputStream();
System.setOut(new PrintStream(bos));
// action
App.main(null);
// assertion
Assert.assertEquals("hello world", bos.toString());
// undo the binding in System
System.setOut(originalOut);
}
为什么会有效?
bos.toString()
返回在测试方法中传递的"Hello World!"
String
:
System.out.println( "Hello World!" );
以这种方式设置System.out
之后:System.setOut(new PrintStream(bos));
,out
变量引用一个PrintStream
对象来装饰ByteArrayOutputStream
对象引用的bos
对象{1}}变量。
因此,任何System.out
次调用都会在byte
对象中写入ByteArrayOutputStream
。
答案 1 :(得分:4)
你可以这样改变你的课程
import java.io.PrintStream;
public class TestHelloWorld {
public final static void main(String[] args) {
doPrint(System.out);
}
static void doPrint(PrintStream ps) {
ps.println("Hello World");
}
}
并通过提供您在doPrint
附近创建的PrintStream
来测试ByteArrayOutputStream
功能:
public void mainMethodTest() throws Exception{
ByteArrayOutputStream data = new ByteArrayOutputStream();
PrintStream ps = new PrintStream(data, true, "UTF-8");
TestHelloWorld.doPrint(ps);
ps.flush();
Assert.assertEquals("Hello World") + System.getProperty("line.separator"), new String(data, "UTF-8"));
}
另一种解决方案是用您自己的系统PrintStream
替换:
System.setOut(new PrintStream(data, true, "UTF-8"));
但这很难看,我试图避免这种情况。以上解决方案更清晰,更易于维护,您可以确保在进行测试时,较大应用程序的其他任何部分都没有向STDOUT打印内容,从而导致其失败。
答案 2 :(得分:1)
如果这就是你的意思,你可以从main方法运行Junit。
public static void main( String[] args )
{
JUnitCore junit = new JUnitCore();
Result result = null;
try {
result = junit.run(MyTestClass.class);
}
catch(Exception e)
{
e.printStackTrace();
}
int passed = result.getRunCount()-result.getFailureCount();
}
public class MyTestClass{
@Test
public void testAllBrowsers(){
//test code and asserts
}
}