测试一个简单的hello world方法

时间:2018-02-12 21:42:28

标签: java

我在春天使用过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));
    }

3 个答案:

答案 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
    }
}