java - Spy を使用して jdbcTemplate クエリ例外をシミュレートする (junit5)

okwaves2024-01-25  185

他のメソッドでも通常の機能が必要なため、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 に関するテスト コード サンプルを確認してください。このテスト。

総合生活情報サイト - OKWAVES
総合生活情報サイト - OKWAVES
生活総合情報サイトokwaves(オールアバウト)。その道のプロ(専門家)が、日常生活をより豊かに快適にするノウハウから業界の最新動向、読み物コラムまで、多彩なコンテンツを発信。