Spring Data Testing - Tuong-Nguyen/Spring GitHub Wiki

Setup

Use junit and mockito https://github.com/Tuong-Nguyen/Spring/wiki/Dependency-injection-practice-and-unit-test#setup

Testing with current configuration class.

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {DataConfiguration.class})
public class UserRepositoryTest {
    @Autowired
    private UserReponsitory userReponsitory;

    @Test
    public void UserRepositoryTest(){
        Assert.assertNotNull(userReponsitory);
    }
}
  • The @ContextConfiguration(classes = {DataConfigurationTest.class}) specify the spring data configyuration class to enable @Repository class in your test.

Testing with another spring data configuration class

Create another configuration class.

@Configuration
@EnableJpaRepositories(entityManagerFactoryRef = "entityManagerFactoryTest", basePackages = "spitter.web")
@EnableTransactionManagement
@ComponentScan("spitter.web")
public class DataConfigurationTest {
    @Bean
    public DataSource dataSourceTest(){
        EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder();
        return builder.setType(EmbeddedDatabaseType.H2)
                .addScript("createDatabse.sql")
                .addScript("insertUser.sql")
                .build();
    }
    @Bean
    public EntityManagerFactory entityManagerFactoryTest(){
        HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        vendorAdapter.setGenerateDdl(true);

        Properties jpaProperties = new Properties();
        jpaProperties.put("hibernate.hbm2ddl.auto", "create-drop");
        jpaProperties.put("hibernate.dialect", "org.hibernate.dialect.HSQLDialect");
        jpaProperties.put("hibernate.hbm2ddl.import_files", "init.sql");

        LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean();
        factoryBean.setDataSource(dataSourceTest());
        factoryBean.setJpaVendorAdapter(vendorAdapter);
        //factoryBean.setJpaProperties(jpaProperties);
        factoryBean.setPackagesToScan("spitter.web.models");
        factoryBean.afterPropertiesSet();
        return factoryBean.getObject();
    }
    @Bean
    public PlatformTransactionManager transactionManager(){
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(entityManagerFactoryTest());
        return transactionManager;
    }
}
  • In the main data configuration class if use didn't set EntityManagerFactory name (@EnableJpaRepositories("spitter.web") the jpa will generate an EntityManagerFactory with default name:"entityManagerFactory".
  • When create new data configuration class you must set another name for EntityManagerFactory: java @EnableJpaRepositories(entityManagerFactoryRef = "entityManagerFactoryTest", basePackages = "spitter.web")

EntityManagerFactory name: "entityManagerFactoryTest"

  • If you want create an datasource with your table and data you can use:
@Bean
public DataSource dataSourceTest(){
    EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder();
    return builder.setType(EmbeddedDatabaseType.H2)
            .addScript("createDatabse.sql")
            .addScript("insertUser.sql")
            .build();
}

and you must disable hibernate database generater cause the hibernate generrator will create an new database follow your entities.

  • Now you can testing with nea data configuration class:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {DataConfigurationTest.class})
public class UserRepositoryTest {
    @Autowired
    private UserReponsitory userReponsitory;

    @Test
    public void UserRepositoryTest(){
        Assert.assertNotNull(userReponsitory);
    }
}