8
Spring Dataリポジトリをテストする方法は?
UserRepositorySpring Dataの助けを借りて作成されたリポジトリ(たとえば、)が必要です。私はspring-dataを初めて使用しますが(springは使用しません)、このチュートリアルを使用します。データベースを扱うための私のテクノロジーの選択は、JPA 2.1とHibernateです。問題は、そのようなリポジトリの単体テストを作成する方法について私が無知であることです。 create()メソッドを例にとってみましょう。私は最初にテストを行っているので、そのための単体テストを作成することになっています。そこで、3つの問題にぶつかります。 最初に、インターフェイスのEntityManager存在しない実装にモックを注入するにはどうすればよいUserRepositoryですか?Spring Dataはこのインターフェースに基づいた実装を生成します: public interface UserRepository extends CrudRepository<User, Long> {} ただし、EntityManagerモックや他のモックを使用するように強制する方法がわかりません。自分で実装を記述した場合、おそらくのセッターメソッドがありEntityManager、モックをユニットテストに使用できます。(実際のデータベース接続に関しては、およびのJpaConfiguration注釈が付けられたクラスが@Configurationあり@EnableJpaRepositories、プログラムDataSourceによってEntityManagerFactory、EntityManagerなどのBeanを定義していますが、リポジトリはテストに適しており、これらのものをオーバーライドできる必要があります)。 次に、相互作用をテストする必要がありますか?私はどのような方法を把握することは困難であるEntityManagerとQuery(それに似呼ばれるようになっているverify(entityManager).createNamedQuery(anyString()).getResultList();)、それは実装を書いている人は私ではないので、。 3番目に、Spring-Dataで生成されたメソッドを最初に単体テストする必要がありますか?私が知っているように、サードパーティのライブラリコードは単体テストではなく、開発者自身が作成したコードのみが単体テストされることになっています。しかし、それは本当ならば、それはまだシーンに最初の質問の背中をもたらします:言うが、私は実装を書くことになるための私のリポジトリ用のカスタムメソッドのカップルを、持って、どのように私は私のモック注入しないEntityManagerとQuery生成され、最終的にはリポジトリ? 注:統合テストと単体テストの両方を使用してリポジトリをテストします。統合テストではHSQLインメモリデータベースを使用していますが、単体テストではデータベースを使用していません。 そしておそらく4番目の質問は、統合テストで正しいオブジェクトグラフの作成とオブジェクトグラフの取得をテストすることは正しいですか(たとえば、Hibernateで定義された複雑なオブジェクトグラフがあるとします)。 更新:今日はモックインジェクションの実験を続けました-モックインジェクションを可能にする静的内部クラスを作成しました。 @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration @Transactional @TransactionConfiguration(defaultRollback = true) public class UserRepositoryTest { @Configuration @EnableJpaRepositories(basePackages = "com.anything.repository") static class TestConfiguration { @Bean public EntityManagerFactory entityManagerFactory() { return mock(EntityManagerFactory.class); } @Bean public EntityManager entityManager() { …