2
respostas

Spring Test - Profile - Não limpa o banco

De acordo com o que é apresentado no curso Spring MVC 2, Aula 07, lição 04.

Meu projeto está correto, está criando os testes, conexão etc... Porém ele NÃO limpa o banco, dessa forma somente com o banco limpo o teste passa, caso contrário ele da erro, pois diz que a quantidade de registros é maior do que o esperado.

Uso o mesmo banco e mesmas versões utilizadas no cursos, as anotações estão da mesma forma e fluindo perfeitamente, só não limpa o banco.

2 respostas

Oi Jefferson, tudo bem?

Me parece algo de configuração. O seu teste está anotado com o @ActiveProfiles("test") e tem um producer do objeto DataSource com @Profile("test")

No seu public DataSource dataSource(){ tenta incluir essas propriedades:

Properties props = new Properties();
    props.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect");
    props.setProperty("hibernate.show_sql", "true");
    props.setProperty("hibernate.hbm2ddl.auto", "create-drop");

com essas configurações o seu banco de dados será dropado e criado novamente

Dessa forma que você está dizendo, eu teria que criar dois properties. No curso ele mantém um somente.

Segue abaixo minha classe de DataSourceConfigurationTest

public class DataSourceConfigurationTest {

    @Bean
    @Profile("test")
    public DataSource dataSource(){
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setUrl("jdbc:mysql://localhost:3306/springMVC2_test");
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUsername("root");
        dataSource.setPassword("postgres");
        return dataSource;
    }

}

Segue abaixo minha classe de Test

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {JPAConfiguration.class,ProdutoDAO.class, DataSourceConfigurationTest.class})
@ActiveProfiles("test") 
public class ProdutoDAOTest {

    @Autowired
    private ProdutoDAO produtoDAO;

    @Test
    @Transactional 
    public void deveSomarTodosOsPrecosPorTipoLivro() {
        //restante do código aqui....
    }
}

Segue abaixo minha classe da JPA

@EnableTransactionManagement
public class JPAConfiguration {

    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) {
        LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean();
        JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        factoryBean.setJpaVendorAdapter(vendorAdapter);

        factoryBean.setPackagesToScan(new String[]{"br.com.springMVC.model", "br.com.springMVC.model.enums", "br.com.springMVC.model.auth"});

        factoryBean.setDataSource(dataSource);
        factoryBean.setJpaProperties(aditionalProperties());

        return factoryBean;
    }

    @Bean
    @Profile("dev") //Qnd profile for Dev, o Spring injetará esse dataSource
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setUsername("root");
        dataSource.setPassword("postgres");
        dataSource.setUrl("jdbc:mysql://localhost:3306/springMVC2");
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        return dataSource;
    }

    private Properties aditionalProperties() {
        Properties props = new Properties();
        props.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect");
        props.setProperty("hibernate.show_sql", "true");
        props.setProperty("hibernate.hbm2ddl.auto", "update");
        return props;
    }

    @Bean
    public JpaTransactionManager transactionManager(EntityManagerFactory emf){
        return new JpaTransactionManager(emf);
    }

}

Observação: Está da mesma forma que o professor cria no curso, por isso minha dúvida.

Sabe oq poderia ser?

Desde já, muito obrigado pelo retorno.