2

メソッドが実行されているときに、(テスト中に) 例外をスローしたいと思います。私はいくつかのことをすることができました:

  1. stub(mock.someMethod("some arg")).toThrow(new RuntimeException());
  2. when(mock.someMethod("some arg")).thenThrow(new RuntimeException())
  3. doThrow.....

通常、スパイ メソッドを呼び出すスパイ オブジェクトを作成します。スタブを使用すると、例外をスローできます。この例外は常にログで監視されます。さらに重要なことは、例外がスローされたメソッドがそれをキャッチして特定の値を返す可能性があるため、テストがクラッシュしないことです。ただし、次のコードでは例外はスローされません (ログでは何も監視されません && 戻り値は true ですが、false になるはずです)。

問題: この場合、例外はスローされません。

    DeviceInfoHolder deviceInfoHolder = new DeviceInfoHolder();

    /*Create Dummy*/

    DeviceInfoHolder mockDeviceInfoHolder = mock (DeviceInfoHolder.class);

    DeviceInfoHolderPopulator deviceInfoHolderPopulator  = new DeviceInfoHolderPopulator(); 

    /*Set Dummy */
    deviceInfoHolderPopulator.setDeviceInfoHolder(mockDeviceInfoHolder);

    /*Create spy */
    DeviceInfoHolderPopulator spyDeviceInfoHolderPopulator = spy(deviceInfoHolderPopulator);

    /*Just exception*/
    IllegalArgumentException toThrow = new IllegalArgumentException();

    /*Stubbing here*/
    stub(spyDeviceInfoHolderPopulator.populateDeviceInfoHolder()).toThrow(toThrow);

    /*!!!!!!Should be thrown an exception but it is not!!!!!!*/
    boolean returned = spyDeviceInfoHolderPopulator.populateDeviceInfoHolder();
    Log.v(tag,"Returned : "+returned);
4

3 に答える 3

1

spy の構文はわずかに異なります。

doThrow(toThrow).when(spyDeviceInfoHolderPopulator).populateDeviceInfoHolder();

詳細については、「実在のオブジェクトをスパイする際の重要な落とし穴!」セクションを参照してください。ここ: https://mockito.googlecode.com/svn/tags/latest/javadoc/org/mockito/Mockito.html#13

于 2014-09-25T12:29:26.670 に答える
1

spyDeviceInfoHolderPopulator.populateDeviceInfoHolder(); のため、新しい回答を作成します。あなたのテスト方法です。

単体テストの基本的なルールの 1 つは、動作をテストする必要があるため、テスト メソッドをスタブしないことです。Mockito を使用して、テスト クラスの疑似依存関係のメソッドをスタブすることができます。

したがって、この場合、おそらくスパイを削除し、テスト メソッドを呼び出して、テストの最終段階 (現在欠落しています) として、テスト メソッドのロジックが正しいかどうかを確認する必要があります。

編集:

最後のコメントの後、あなたがテストしているロジックが最終的に明らかになりました。テスト オブジェクトが XmlReader に依存しているとします。また、このリーダーには「readXml()」というメソッドがあり、XML から読み取るためのテスト ロジックで使用されると想像してください。私のテストは次のようになります。

XmlReader xmlReader = mock (XmlReader.class);
mock(xmlReader.readXml()).doThrow(new IllegalArgumentException());

DeviceInfoHolderPopulator deviceInfoHolderPopulator  = new DeviceInfoHolderPopulator(xmlReader); 

//call testing method
boolean returned = spyDeviceInfoHolderPopulator.populateDeviceInfoHolder();

Assign.assignFalse(returned);
于 2014-09-25T13:13:19.177 に答える
0

スパイオブジェクトの作成はここが悪いです。

作成は次のようにする必要があります

DeviceInfoHolderPopulator spyDeviceInfoHolderPopulator = spy(new DeviceInfoHolderPopulator());

次に、スパイ オブジェクトでメソッドをスタブします。

参考:API

編集:

これはAPIからのものです。

Sometimes it's impossible or impractical to use Mockito.when(Object) for stubbing spies. 
Therefore for spies it is recommended to always 
use doReturn|Answer|Throw()|CallRealMethod family of methods for stubbing. 
Example:

List list = new LinkedList();
List spy = spy(list);

//Impossible: real method is called so spy.get(0) throws IndexOutOfBoundsException (the list is yet empty)
when(spy.get(0)).thenReturn("foo");

//You have to use doReturn() for stubbing
doReturn("foo").when(spy).get(0);
于 2014-09-25T12:27:43.730 に答える