Junit @ Test方法,在运行时提供输入

时间:2017-10-12 10:41:19

标签: java junit

我班上写的方法

public static Advertisement[] createAd() throws IOException
{
    BufferedReader br=new BufferedReader(new InputStreamReader(System.in));

    Advertisement[] ad = new Advertisement[5];
    int count =0;
    char ch;
    do
    {
    System.out.println("Enter advertisement id:");
    int id=Integer.parseInt(br.readLine());
    System.out.println("Enter advertisement type:");
    String type=br.readLine();
    ad[count]= new Advertisement(id, type);
    count++;
    System.out.println("Do you want publish another   advertisement(Y/N):");
     ch = br.readLine().charAt(0);

    if((ch!='y')&&(ch!='Y'))
    {
        break;
    }

    }while(count<=5);
    if(count==5)
    {
        System.out.println("Maximum ads reached");
        return ad;
    }
    return ad;
}


Juint @Test method
 @Test
public void testCreateAd() throws IOException
{
    Advertisement[] a = Advertisement.createAd();
    assertTrue("Maximum five ads only should be created",(a.length<=5));
}

我想检查一下,createAd方法应该返回类型为Advertisement的5个对象的最大值。但是当@Test方法运行它要求输入时,我们可以通过某些地方将输入传递给那些readLine方法

2 个答案:

答案 0 :(得分:0)

我认为你需要模拟缓冲的阅读器。 你可以将它作为方法参数传递(或创建另一个接受它作为参数的方法,然后在测试代码中模拟它。 看看this

答案 1 :(得分:0)

BufferedReader应该是private班级成员。如果你这样做,你可以在你的测试类中@Mock这个成员,然后你可以控制它的每次调用和返回值。

@Mock
private BufferedReader bufferedReaderMock;

Mockito.doReturn("some input").when(bufferedReaderMock).readLine();

现在,您可以控制和模拟用户可能输入的值。 在yoz断言之前不要忘记这一点:

Mockito.verify(bufferedReaderMock).readLine(); // Verify it was called
Mockito.verifyNoMoreInteractions(<all mocks)); // verify no other dependency class/member was called.