2017-10-12 73 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

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