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@Repositoryclass 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
EntityManagerFactoryname (@EnableJpaRepositories("spitter.web")the jpa will generate anEntityManagerFactorywith 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);
}
}