2017-03-19 10 views
-3

私はPersonを受け取り、PersonException(私のカスタム例外)が返されるかどうかを調べるJUnitテストを行っています。 PersonExceptionがExceptionを継承し、Personが100を超える場合にPersonExceptionをスローするメソッドSetDOB()があります。これまでのところ例外はコンソールに表示されますが、何らかの理由でテストに失敗しました。関連するコードは次のとおりです。カスタムJava例外が失敗するJUnitテスト

//JUnit Test 
@Test(expected = PersonException.class) 
public void testBadShieffer1() { 
    Staff wrongShieffer = new Staff("Bob", "Lloyd", "Shnieffer", 
     new Date(1737, 2, 25), "Shieffer Lane", "21277777778" /*PhoneNumber*/ , 
     "[email protected]", 
     "Radio time.", 10, 500000.00, new Date(1991 + 1900, 1, 1), eTitle.MR); 
    //This constructor calls SetDOB() 
    fail("No PersonExceptions were thrown."); 
} 

//setDOB 
public void setDOB(Date DOB) { 
    try { 
     if (((new Date()).getYear() + 1900) > DOB.getYear() + 100) 
      throw new PersonException(this); 
     else 
      this.DOB = DOB; 
    } catch (PersonException p) { 
     System.out.println(p + " is over 100 years old!"); 
    } 
} 

//PersonException class 
public class PersonException extends Exception { 
    private Person p; 

    public PersonException() { 
     super(); 
    } 

    public PersonException(String message) { 
     super(message); 
    } 

    public PersonException(Person p) { 
     super(p.getLastName()); 
     this.p = p; 
    } 

    public Person P() { 
     return p; 
    } 
} 

これは長い少しである場合、私は謝罪が、私は存在があるにする必要がありますすべてを信じて。助けをあらかじめありがとう!

+0

アドバイスの言葉ではなく、Java 8 time api(https://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html)を使用してください。非常に悪いと不自由な古い日付のAPI(http://stackoverflow.com/questions/1969442/whats-wrong-with-java-date-time-api)。 – ThisIsNoZaku

+4

書かれているように、 'setDOB'は投げられた直後に' setDOB'メソッド内で捕捉しているので、 'setDOB'は決して' PersonException'を投げません。 '(expected = PersonException.class)'を使ったテストは、例外を捕捉することになります。 – Thomas

+0

トーマス、返事をありがとう。それは実際に私の推測でもありました。しかし、私はそれをキャッチすることなく、tryステートメントで例外をスローする方法についてはわかりません。助言がありますか? – JonRicardo

答えて

2

私のコメントで述べたように、スローされる例外も同じ方法で捕らえられているので、テストケースは決して合格しません。この2つの方法のいずれかを修正することができます。それは、どのような例外をスローするかによって異なります。 A チェックされた例外は、setDOB()が呼び出されたときに捕捉され、処理される必要があります。あなたはにsetDOBを変更することでこれを実装することができます:あなたはこの問題を解決することができ

public void setDOB(Date DOB) throws PersonException { 

    if (((new Date()).getYear() + 1900) > DOB.getYear() + 100) { 
      throw new PersonException(this); 
    } 
    else { 
     this.DOB = DOB; 
    } 
} 

他の方法は、PersonExceptionチェックされない例外を行うことです。この種の例外はコール時に捕捉する必要はありません。あなたはにsetDOB()を変更することでこれを実現できます。

public void setDOB(Date DOB) { 

    if (((new Date()).getYear() + 1900) > DOB.getYear() + 100) { 
      throw new PersonException(this); 
    } 
    else { 
     this.DOB = DOB; 
    } 
} 

そしてPersonExceptionがそうのように、むしろExceptionより、RuntimeExceptionを拡張する必要があり:あなたのユニットテストをそのまま渡すために、

public class PersonException extends RuntimeException 

未確認アプローチがうまくいくでしょう。例外の詳細については、hereをご覧ください。

+0

私はCheckedアプローチを採用することに決めました。私は結果的にいくつかのメソッドにPersonExceptionをスローする必要があるため、最初は気にしませんでしたが、この状況ではもっと論理的な方法のように思えます。とても有益で迅速に対応してくれてありがとう! – JonRicardo

関連する問題