0

Mockito と MockMvc を使用した Controller Unit テストがあります。

POST リクエストの後、POST されたオブジェクトは正しく解決されますが、私のリポジトリ モックはトリガーされません。

モックコードは次のとおりです。

    Date mydate = new Date();
    Notification not = new Notification();
    not.setId(-1L);
    not.setUserid("BaBlubb");
    not.setTimestamp(mydate);
    not.setContent("MyContent");

    Notification not2 = new Notification();
    not2.setId(1L);
    not2.setUserid("BaBlubb");
    not2.setTimestamp(mydate);
    not2.setContent("MyContent");

    when(notificationRepository.save(not)).thenReturn(not2);

したがって、これはオブジェクトの保存をシミュレートするだけです (ID が設定され、そこからルートが生成されます)。

残念ながら、リポジトリは常に null を返すため、新しく作成された Route を null から返そうとすると、後でコードが失敗します。

モックは正しく挿入され、文字列比較などで機能します。または、関数が呼び出されたことを確認するだけの場合、オブジェクトでトリガーすることはできません。

同じ問題が発生します

        verify(notificationRepository, times(1)).save(not);

トリガーしません。

質問は次のとおりです。1.) モックがトリガーされないのはなぜですか? オブジェクトの値が等しいかどうかはチェックしないと思いますが、オブジェクトがシリアライズされ、デシリアライズされるため、オブジェクト識別子は同じではありません。

2.) 一般的なモックを取得するにはどうすればよいですか? たとえば、repository.save() が呼び出されるたびに、パラメータに関係なく、常に特定の方法で実行する必要があります。

when(notificationRepository.save(not)).thenReturn(not2);

私はしたいです

when(notificationRepository.save()).thenReturn(not2);

PS何らかの理由で残りのコードが必要な場合は、ここに送信された部分があり、オブジェクトは通知のjson表現です(jacksonを使用)

 mockMvc.perform(post("/api/notification").content(object)
                .contentType(MediaType.APPLICATION_JSON)
                .accept(MediaType.APPLICATION_JSON));

これがコントローラーヘッダーです。オブジェクトは完全に逆シリアル化され、値は1:1で同じです

 @RequestMapping(method=RequestMethod.POST)
    public ResponseEntity<?> postNotification(@RequestBody Notification n) {
        logger.debug("Saving userid "+n.getId());

助けてくれてありがとう。

4

2 に答える 2

1

1.) モックがトリガーされないのはなぜですか? オブジェクトの値の等価性をチェックするのではなく、同じではないオブジェクト識別子をチェックすると思います...

デフォルトでは、Mockito はオブジェクトのequalsメソッドに委譲します。それをオーバーライドしていない場合は、デフォルトで参照がチェックされます。次の 2 行は同等です。

when(notificationRepository.save(not)).thenReturn(not2);
when(notificationRepository.save(not)).thenReturn(eq(not2)); // uses eq explicitly

同じフィールドを持つすべての Notification オブジェクトが同じである場合、equalsandhashCodeをオーバーライドすると、必要な場所に移動できます。ただし、特に Notification オブジェクトが保存されるまで ID を持たない場合は、Set および Map の動作に関して意図しない副作用が生じる可能性があることに注意してください。

2.) 一般的なモックを取得するにはどうすればよいですか? たとえば、repository.save() が呼び出されるたびに、パラメーターに関係なく、常に特定の方法で実行する必要があります

Matcher を使用すると、これは非常に簡単です。

when(notificationRepository.save(not)).thenReturn(any(Notification.class));

Matcher は非常に強力ですが、注意してください。Matcher の使用にはいくつかのトリッキーなルールがあります。

于 2015-06-12T17:55:17.593 に答える