I have a class to which I must pass 2 arguments through its main method, if passed less than 2 args, it displays a system error message. I wrote a unit test for the main method here, when I run the test, it stops at "running" (shows neither pass nor fail). Please suggest.
Example.java
public class Example 
{
    private static String str1   = null;
    private static String str2   = null;
    public static void main(String[] args)
    {
        if( args.length != 2 )
        {
            call();
        }
        Example ex = new Example(args[0], args[1]);
        ex.getData();
    }
    public Example(String str1, String str2)
    {
        Example.str1 = str1;
        Example.str2 = str2;
    }
    public void getData(){
        System.out.println("Name is: "+str1);
        System.out.println("City is: "+str2);
    }
    private static void call()
    {
        System.err.println("Usage: String1 String2");
        System.err.println("Where: ");
        System.err.println("       String1 - Name");
        System.err.println("       String1 - City");
        System.exit(1);
    }   
}
ExampleTest.java
public class ExampleTest {
    @Test
    public void testPassingWrongNumberOfInputs() {
        StringBuffer sb = new StringBuffer();
        sb.append("Usage: String1 String2")
        .append("Where: ")
        .append("       String1 - Name")
        .append("       String1 - City");
        String expectedErrorMessage = sb.toString();
        ByteArrayOutputStream outContent = new ByteArrayOutputStream();
        System.setErr(new PrintStream(outContent));
        String[] args = {"one"};
        Example.main(args);
        assertEquals(expectedErrorMessage, outContent.toString());
    }
}
                How about the following:
class TestingSecurityManager extends SecurityManager {
  @Override public void checkExit(int status) {
    throw new SecurityException();
  }
}
Then in your test...
public class ExampleTest {
    @Test
    public void testPassingWrongNumberOfInputs() {
        StringBuffer sb = new StringBuffer();
        sb.append("Usage: String1 String2")
        .append("Where: ")
        .append("       String1 - Name")
        .append("       String1 - City");
        String expectedErrorMessage = sb.toString();
        ByteArrayOutputStream outContent = new ByteArrayOutputStream();
        System.setErr(new PrintStream(outContent));
        String[] args = {"one"};
        TestSecurityManager sm = new TestSecurityManager ();
        System.setSecurityManager(sm);
        try {
            Example.main(args);
            //should throw
            fail("Should have thrown exception");
        } catch (SecurityException se) {
        }
        assertEquals(expectedErrorMessage, outContent.toString());
    }
}
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With