2017-08-14 20 views
1

generateRandomByteInRangeという関数をテストしています。 それは失敗し、私はそれが得た正確な値を見たい(それは-127未満であっただけではない)。 私はtry-catchでアサートを囲みようとしましたが、コンソールにプリントできないのに何も起こりませんでした。Hamcrest - コンソールに出力

機能 -

byte generateRandomByteInRange(int minVal,int maxVal) { 
    Random rnd; 
    rnd = new Random(); 
    return (byte) (rnd.nextInt(maxVal - minVal + 1) + minVal); 
} 

テスト -

@Test 
public void generateRandomByteInRange() { 
    int res; 
    int minVal,maxVal; 

    minVal = 1; 
    maxVal = 3; 
    for (int i = 0; i < 100; i++) { 
     res = AF.generateRandomByteInRange(minVal, maxVal); 
     assertThat(res, is(both(greaterThanOrEqualTo(minVal)).and(lessThanOrEqualTo(maxVal)))); 
    } 

    minVal = -127; 
    maxVal = 128; 
    for (int i = 0; i < 1000; i++) { 
     res = AF.generateRandomByteInRange(minVal, maxVal); 
     try { 
      assertThat(res, is(both(greaterThanOrEqualTo(minVal)).and(lessThanOrEqualTo(maxVal)))); 
     } catch (Exception e) { 
      System.out.println(res); 
     } 

    } 
} 

テストが失敗したと私は(右に)、次のメッセージが表示されます

enter image description here

答えて

4

Hamcrestは必ずしもありませんあなたの価値を報告して最大の仕事をしてください。あなたが持っているアサーションメッセージを詳しく見てみると(強調のために強調表示)、-128が実際には違反価値であることがわかります。これは、res = AF.generateRandomByteInRange(minVal, maxVal)をハードコードされた値(例:res = 400)に変更してアサーションメッセージを確認することで確認できます。

java.lang.AssertionError: Expected: is (a value equal to or greater than <-127> and a value less than or equal to <128>) but: a value equal to or greater than <-127><-128> was less than <-127>

例外をキャッチするためにあなたの試みについて - やや冗長ながら(上記参照)、あなたは良いアイデアを持っていましたが、あなたは間違った例外をキャッチしました。アサーションが失敗すると、AssertionErrorがスローされます。これはチェックされていない例外なので、キャッチしようとしたjava.lang.Exceptionではなく、java.lang.Errorに拡張されます。明示的にキャッチしてAssertionError(またはその基本クラスの1つ)に置き換えればOKです。

+1

**例外の再試行**を忘れることなく追加することができます。あなたはまだテストが失敗するのを望んでいます。 *渡し*テストが実際にコンソールにエラーを表示したことを見落としても、そのエラーを忘れることはありません。 – GhostCat

関連する問題