2017-05-09 15 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'を模倣しようとしています –

答えて

1

まず、あなたのメソッドは例外をスローしません(あなたはそれをキャッチしてfalseを返しています)。次に、ParseExceptionがスローされることをどのようにテストできますか。 メソッドがfalseを返すかどうかをテストする必要があるので、これはparseExceptionがスローされたことを意味します。
スローされた例外をテストする場合は、メソッド内で例外をキャッチしないでください。
第2に、あなたのテストメソッド名は本当に混乱しています。それはtestIsValidDateとなりますが、有効ではない日付スロー例外についてはテストしています。
はちょうどあなたが外DateValidationクラスを、それを呼び出すことができなくなりますので、この方法isValidは、プライベートで、DateValidationクラスでは、この

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

ありがとう、私はテストメソッド名をあまり混乱させないように修正しました。私のメソッドisValidDateは私的静的メソッドなので、私はクラスを偽装しなければならないと仮定します。それが消えることを願っています。 –

+0

オハイオ州それは唯一の静的ですが、ごめんなさい。 – pvpkiran

+0

が私の答えを更新しました。 – pvpkiran

0

を行います。

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が必要です。

関連する問題