2017-08-25 5 views
1

mockitoメソッドの使命を説明してください。ドキュメンテーションによれば、このメソッドはメソッドが呼び出されたかどうかをチェックします。しかし、本当に有用な例を挙げることはできますか?通常、テストメソッドでは、メソッドを呼び出してから、今すぐ呼び出すかどうかチェックします。奇妙に聞こえる。Mockito、メソッドベリファイの使途

+0

ちょうど記録のために:初心者は答えを受け入れることを忘れることがあります。だから、ある時点で回答の一つを受け入れることを検討してください;-) – GhostCat

+0

私は忘れないで...正しい答えは分かりません)))だから、将来誰かを非難することはできません。 –

+0

あなたは入力をダイジェストし、あなたはその主題をどのように理解したかを考えます。あなたは良い入力を持って、そこから何かを選ぶのは難しいはずはありません。 – GhostCat

答えて

1

簡略化するには... の特定のパラメータを使用してテストする方法を考えてみましょう。どのメソッドAがコールするかは、B,CおよびDです。

Mockito.verifyメソッドB、C、Dが実際に呼び出されたことをテストできます。それも、あなたのような、より複雑なテストを指定してみましょう:

  • 少なくとも(1)
  • [最大(10)

方法あなたは振る舞いをテストしているとき、それは本当に便利ですそれと呼ぶパラメータに基づいています。

+0

私はあなたを理解しましたか? 私は方法があります: public void method1(){ method2(); }公共ボイド方法2(){} 私は MYCLASSを記述する場合。method1(); verify(mResource).method2(); - 私は緑のテストラインを取得する必要がありますか?しかし、私は赤があります。それは私に言う: 募集されているが呼び出されていない: mResource.method2(); 私は間違ったやり方をしていますか? –

2

このタイプのチェックは、指定されたパラメータを使用して特定のオブジェクトが使用されたことを確認するために実行されることがよくあります。何らかのアクションを実行するビジネスサービスをテストしていて、このプロセス中に何らかの監査証跡がDBに格納されているとしましょう。

DBにこの種の情報を保存しているので、別のユニットテストや別の種類の外部ライブラリが使用されているため、監査データが正しく格納されているかどうかを確認する必要はありません。あなたのテストケースのために、このメソッドが呼び出されたという情報で十分です。そして、それは 'verify'メソッドのユースケースです。

2

通常、テストメソッドでは、メソッドを呼び出してから、今すぐ呼び出しましたか?奇妙に聞こえる。

テストメソッドが呼び出されたことを確認していません。あなたは、そのテストが何をしたとしても、(モックに置き換えられた)依存関係が呼び出されたことを確認します。

たとえば、パスワードチェッカーメソッドをテストするときに、間違ったパスワードを拒否するだけでなく、失敗したログイン試行を登録するために監査バックエンドシステムを呼び出すことをアサーションする必要があります。あなたのモックオブジェクトは、そのバックエンドシステムのために立つだろうし、あなたはそれが(そして適切なパラメータで)呼び出されたことを確認するためにそれを使用することができます。

3

それはこのように書き:

public class UnderTest { 
    private Foo foo; 

    public UnderTest(Foo foo) { this.foo = foo }; 

    public void bar() { foo.foo(); } 
} 

は、今あなたがUnderTestに嘲笑 fooのインスタンスを提供することを前提としています。そしてになることを確信してくださいbar()が呼び出されたときにfoo.foo()が呼び出されます。

次に、verify()を使用して、予期されるコールが行われたことを確認します。

つまり、テストはメソッドの動作を確認する必要があります。理想的には、によって、をテスト対象のメソッドから返された値にアサートするのが理想的です。しかし、すべてのメソッドが何かを返すわけではない。 少なくとも、テスト対象のクラスに所有されている/渡されたオブジェクトの特定の期待された呼び出しが行われたことを確認してコードを確認してください。そして、verify()が必要です!

0

プレーンJDBCによってデータベースとやりとりするDAOクラスがあるとしましょう。データベースにデータを書き込む方法があり、それを単体テストする必要があります。これを行うには、おそらくConnectionクラスをモックします。データベースに書き込むときはおそらくcommitメソッドをこのモックで呼び出しますが、返されるタイプはvoidなので、テスト中にそのメソッドが呼び出されたことを保証することはできません。このような問題を解決するには、verifyを使用できます。 お手伝い願います!

+0

ベリファイチェックが成功したことを意味しますか\t メソッドの完了? –

+0

@ MarariaKarpikovaは、メソッドが呼び出されたことを確認するだけです。 –

0

メソッドは、何かまたはvoidを返します。
ユニットテストでは、メソッドが何かを返すので、一般に、その結​​果を特定の値でモックし、テストされたメソッドのフローが必要に応じて実行されることを確認します。
モックするメソッドが何かを返すかのように、一般に、テストされたメソッドの次のステートメントまたはテストされたメソッドによって返された結果のいずれかの結果が必要です。

メソッドが何も返さないため(void)、事柄が異なります。結果をモックすることはできません。
しかし、このメソッドが呼び出され、期待されるパラメータがあると主張できます。


は、例えば、文書

public class PrintService{ 
... 
    public void printMessage(String message){ 
    os.print(message); 
    } 
} 

を印刷する PrinterServiceクラスを想像そして、あなたは別のクラスのユニットテストの間にそれを隔離する必要があるとします。
ここではテストに方法:

public class PrintClient{ 
... 
    PrintService printService; 

    public void print(String message, PrinterParameters printerParameters...){ 
    ... // do some tasks 
    ... 
    printService.print(message); 
    ...   
    } 
} 

何も返しませんPrintService.print()
PrintClientのユニットテストでは、PrintService.print()の結果を模擬したくないです。
に渡されたmessage引数がPrintClientのテスト済みメソッドに渡されていることを確認するだけです。

+0

@Thilo本当に申し訳ありませんが、私はあなたが何を意味するかは分かりません。私は単体テストのクライアントから提供された良いパラメータでサービスが呼び出されたことを確認したいので、モックオブジェクトのメソッドを呼びたくはありません。 – davidxxx

+0

ああ、私の悪い、申し訳ありませんが、欠落している@InjectMocksに混乱しました。 –

+1

@Florian Schaetzいいえ、私です。私はおそらく命名が悪いと思う。 'PrintClient.print()'と 'PrintService.print()'は混乱するかもしれません。私は明確なコンストラクタを追加しました。 – davidxxx