0

Spring 3.1.1/JPA/Hibernate 4 Web アプリ用に、いくつかの JPA リポジトリ、サービス、およびサポート クラスを作成しました。ただし、ユニットと統合テストをいくつか書きたいと思っています (最初にそれらを書くことになっています)。XML ではなく JavaConfig を使用しているため、テストする最善の方法を考えています。私が解決しようとしている特定の問題は次のとおりです。

DataSource、JpaTransactionManager、LocalContainerEntityManagerFactoryBean、およびすべてのリポジトリを宣言する @Configuration があります。明らかに、統合テストのためにすべてを開始したくないので、EmbeddedDatabase と H2 を使用してメモリ内データベースを作成し、値を入力してから、それに対してリポジトリを使用できると考えました。ただし、私が見たドキュメントは、これをまとめるのに役立ちませんでした。私はこれを持っています:

@RunWith( SpringJUnit4ClassRunner.class )
public class TestMenuService {

    private EmbeddedDatabase database;

    @Autowired
    private MenuRepository menuRepository;

    @Before
    public void setUp() throws Exception {
        database = new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.H2).setName("myschema")
                .addScript("classpath:schema.sql").build();

        menuRepository = new MenuRepository();
        Assert.assertNotNull(database);
    }

しかし、menuRepository はインスタンス化されないため、@Configuration のテスト バージョンを作成してみました。

@Configuration } )
@ComponentScan( basePackages = { "com.mycompany.service"} )
@EnableTransactionManagement
@ImportResource( "classpath:applicationContext.xml" )
@PropertySource( "classpath:test-application.properties" )
public class TestEdmConfiguration {

    @Bean
    MenuRepository menuRepository() {
        return new MenuRepository();
    }

私のtest-applicationContext.xml

<jpa:repositories base-package="com.mycompany.servce.repository"/>

私のtest-application.properties:

db.driver=org.h2.Driver
db.username=sa
db.password=
db.url=jdbc:h2:mem:myschema

hibernate.dialect=org.hibernate.dialect.H2Dialect
hibernate.format_sql=true
hibernate.hbm2ddl.auto=create
hibernate.ejb.naming_strategy=org.hibernate.cfg.ImprovedNamingStrategy
hibernate.show_sql=true

ただし、これには、上記のすべてのデータソースなどを作成する必要があります。この Bean のすべてのサポート Bean を複製しているようです。

他のすべての依存関係なしに、リポジトリと組み込みデータベースをテストに分離する方法はありますか?

4

1 に答える 1

2

完全な統合テストでリポジトリをテストしたい場合は、EntityManagerFactory、PlatformTransactionManagerなど、他のすべてをセットアップする必要があると思います。

Spring 3.1を使用しているので、Beanプロファイルを使用してこれを実現することをお勧めします。

テスト用とアプリケーション用の2つのプロファイルを作成し、それぞれがデータソースを提供します。

@Configuration
@Profile("test")
public class EmbeddedDataSource {

  @Bean
  public DataSource dataSource() {
    // Return a H2 datasource
  }

}

@Configuration
@Profile("application")
public class ApplicationDataSource {

  @Bean
  public DataSource dataSource() {
    // Return a normal datasource
  }

}

次のように、Springコンテキストを起動するテストを作成できます。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(loader = AnnotationConfigContextLoader.class, classes = { MyConfigClass.class })
@ActiveProfiles(profiles = {"test"})
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)
public class TestRepository {



}

ここでは、テストでアクティブなプロファイルを指定できます。

于 2012-11-25T22:23:14.030 に答える