2017-05-09 43 views
1

我有低於這個方法如下:如何爲私有靜態方法模擬解析異常?

public class DateValidation() { 
     private static boolean isValid(String date) { 
      SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy"); 
      dateFormat.setLenient(false); 
      try {   
       dateFormat.parse(inDate.trim()); 
      } 
      catch (ParseException pe) { 
        pe.printStackTrace(); 
        return false; 
      } 
      return true; 
     } 
    } 

到目前爲止,這是我的模擬測試:

public void testIsValidDate_Exception() throws Exception { 
    PowerMockito.spy(DateValidation.class); 
    PowerMockito.doThrow(new ParseException(null,0)).when(DataValidation.class, "isValidDate", "01/012017"); 
} 

但是,這是我在哪裏卡住了。我如何確認測試結果爲ParseException?如果輸入日期的格式不正確,那應該丟掉ParseException,對吧?

+0

你爲什麼嘲笑?你不是試圖自己測試這種方法嗎? –

+0

'DateValidation'類僅包含'isValid'方法,但您試圖模擬'isValidDate' – 2017-05-09 16:48:31

回答

1

首先,你的方法沒有拋出任何異常(你捕捉它並返回false)。那麼,你怎麼能測試它拋出ParseException。 所以你必須測試方法是否返回false,這意味着它拋出了parseException。
如果你想測試拋出的異常,那麼你不應該在你的方法中捕獲異常。
其次,您的測試方法名稱確實令人困惑,它讀取testIsValidDate,但您正在測試無效日期拋出異常。
只是這樣做

DateValidation spyDateValidation = PowerMockito.spy(DateValidation.class);   
boolean result = Whitebox.invokeMethod(spyDateValidation, "isValidDate", "01/012017"); 
assertFalse(result); 
+0

謝謝,並且我已經修復了測試方法名稱以減少混淆。由於我的方法isValidDate是私有的靜態方法,因此,我假設我必須模擬/窺探這個類。希望它清除。 –

+0

ohh對不起,我雖然只是靜態的。 – pvpkiran

+0

更新了我的答案。 – pvpkiran

0

DateValidation類,方法isValid私人,所以你將無法外界稱之爲DateValidation類。並測試它,你需要調用的測試類中的方法,所以第一件事就是添加調用它的另一種方法:

public class DateValidation { 

    private static boolean isValid(String date) throws ParseException { 
     SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy"); 
     dateFormat.setLenient(false); 
     try { 
      dateFormat.parse(date.trim()); 
     } catch (ParseException pe) { 
      pe.printStackTrace(); 
      return false; 
     } 
     return true; 
    } 

    // public method that calls isValid private method (so I can call it in another class) 
    public static void isValidDate(String date) throws ParseException { 
     DateValidation.isValid(date); 
    } 
} 

現在,你的測試類將是這樣的:

@RunWith(PowerMockRunner.class) // needed for powermock to work 
// class that has static method and will be mocked must be in PrepareForTest 
@PrepareForTest({ DateValidation.class }) 
public class DateValidationTest { 

    // this test expects ParseException to be thrown 
    @Test(expected = ParseException.class) 
    public void testIsValidDate_Exception() throws Exception { 
     PowerMockito.spy(DateValidation.class); 
     // mock static private method 
     PowerMockito.doThrow(new ParseException(null, 0)).when(DateValidation.class, "isValid", "01/012017"); 

     // call the public method (isValidDate) that calls mocked private method (isValid) 
     DateValidation.isValidDate("01/012017"); 
    } 
} 

expected = ParseException.class是關鍵部分。就這樣,測試知道它必須檢查是否有ParseException(如果不發生異常失敗)


注:如果希望isValid方法拋出ParseException所有情況無效輸入(不僅在您的測試中),您必須刪除try/catch塊並且只需撥打dateFormat.parse

在這種情況下,您不需要嘲笑它,因爲如果輸入無效,它總是會拋出異常。無論如何,在測試中您仍然需要expected = ParseException.class來檢查是否發生異常。