2017-10-12 71 views
0

写在我的班级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方法应该返回类型广告的5对象的最大。但是当@ Test方法运行时,它会询问输入,我们是否可以通过某些方法将输入传递给那些readLine方法

+0

要看的东西:https://stackoverflow.com/a/6416591/1531124。事情是:你*可以*使用一些技巧测试从System.in中读取的代码。但是:你不应该这样做。您完全*隐藏*您的代码通常从生产代码中的标准输入读取的事实。以便它可以与*任何*种输入一起使用。 – GhostCat

回答

0

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

+0

非常感谢。 –

+0

这确实意味着你解决了?如果是这样,请为下一个用户编写解决方案,或将正确的答案标记为解决方案。 – marco

0

BufferedReader应该是一个private类成员。如果您为此,您可以@Mock该成员在您的TestClass,然后你可以控制它的每一个调用和返回值。

@Mock 
private BufferedReader bufferedReaderMock; 

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

现在,你可以控制和模拟用户可能输入的值。 鸵鸟政策之前忘记了这一点yoz're主张:

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

非常感谢你 –

+0

它适合你吗? – LenglBoy

+0

是的..我用另一种方式得到相同的.. –