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());
助けてくれてありがとう。