他のメソッドでも通常の機能が必要なため、Mock ではなく Spy を使用しています。
jdbcTemplate クエリの呼び出し中に例外をシミュレートしたいと考えています。
JdbcTemplate.query プロトタイプは公開されています <T>リスト<T> query(String sql, RowMapper<T> rowMapper) は DataAccessException をスローするので、次のように呼び出します。
jdbcTemplate.query("select 1 from dual", new SingleColumnRowMapper<>());
これが私のスパイ宣言です:
@SpyBean
JdbcTemplate jdbcTemplate;
そして、これがテストです:
@Test
void testDbIsDown() {
when(jdbcTemplate.query(anyString(),any(SingleColumnRowMapper.class)))
.thenThrow(new DataAccessResourceFailureException("s"));
Health health = dbServiceValidator.health();
assertThat(health.getStatus().getCode())
.isEqualTo(Health.down().build().getStatus().getCode());
}
実行すると例外 java.lang.IllegalArgumentException がスローされます。RowMapper が必要ですが、@MockBean (必要な SpyBean ではなく) では正常に動作します。
モックでは機能するのに、スパイでは機能しないのはなぜですか? @Spy で動作させるにはどうすればよいですか?
追記
と同じ動作
when(jdbcTemplate.query(anyString(),any(RowMapper.class)))
.thenThrow(DataAccessException.class);
この投稿を参照してください。お役に立てば幸いです。
– ハンツィー
2020 年 9 月 3 日 12:41
@Hantsy ありがとうございます!読んだ後、実際にはモックで例外をスローせず、何もしないだけであることがわかりました。したがって、実際には、JdbcTemplate.query をモックする方法を理解する必要があります。
– AsfK
2020 年 9 月 3 日 14:11
------------------------
Spring Boot @MockBean または @SpyBean を使用する場合、どちらも Spring 対応です。
Mockito モックとスパイを理解するには、特に Baeldung の Mockito シリーズを確認してください。 Mockito モックを Spring Bean に注入します。
私は、Mockito と Spring (Spring Boot ではありません) を使用し、実際のインスタンスをスパイし、スタブ化によってメソッドをモックして置き換える簡単なテスト コード サンプルを作成しました。
doNoting、doAnswer、doReturn、doThrow の使用法は似ており、スパイ オブジェクトのメソッドを実行する前に、スタブ動作でこれらのメソッドを呼び出して結果を返します。
興味がある場合は、私の github から Mockito に関するテスト コード サンプルを確認してください。このテスト。