Ao mudar a propriedade para create-drop o teste funciona perfeitamente , porém no exemplo da aula funciona tanto Spring Test quanto na aplicação com a propriedade DDL do hibernate setada update.
Alguém já passou por isso?
package br.com.casadocodigo.loja.conf;
import java.util.Properties;
import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Profile;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.JpaVendorAdapter;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@EnableTransactionManagement
public class JPAConfiguration {
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) {
LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean();
JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
factoryBean.setJpaVendorAdapter(vendorAdapter);
factoryBean.setDataSource(dataSource);
factoryBean.setJpaProperties(aditionalProperties());
//factoryBean.setJpaProperties(aditionalProperties());
//Configura o pacote de modelos para saber quais entidades o Hibernate irá gerenciar
factoryBean.setPackagesToScan("br.com.casadocodigo.loja.models");
return factoryBean;
}
@Bean
@Profile("dev")
public DataSource dataSource(){
/*
* Configura as informações do nosso DataSource que irá ser reponsável
* por controlar a quantidade de conexões no banco de dados, além de informar
* qual usuário,senha, url de conexão com o banco e o driver utilizado,
* driver este que implementas as interfaces da API do JDBC.
*/
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setUsername("root");
dataSource.setPassword("");
dataSource.setUrl("jdbc:mysql://localhost:3306/casadocodigo?useTimezone=true&serverTimezone=UTC");
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
//dataSource.setDriverClassName("com.mysql.jdbc.Driver");
return dataSource;
}
public Properties aditionalProperties() {
/*
* Configurações de propriedade do Hibernate, tipo de dialeto do banco de dados utilizado:
* Mysql, PostGress,SQLServer, Oracle ou DB2, forma de trabalho do banco de dados,
* update reflete cada alteração da entidade no banco de dados.
*/
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);
}
}
public class DataSourceConfigurationTest {
@Bean
@Profile("test")
public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setUsername("root");
dataSource.setPassword("");
dataSource.setUrl("jdbc:mysql://localhost:3306/casadocodigo_test?useTimezone=true&serverTimezone=UTC");
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
return dataSource;
}
}
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(
classes = {JPAConfiguration.class,ProdutoDAO.class,DataSourceConfigurationTest.class,UsuarioDAO.class})
@ActiveProfiles("test")
public class ProdutoDAOTest {
@Autowired
public ProdutoDAO produtoDao;
@Test
@Transactional
public void deveSomarTodosOsPrecosPorTipoLivro() {
List<Produto> livrosImpressos = ProdutoBuilder.newProduto(TipoPreco.IMPRESSO, BigDecimal.TEN).more(3).buildAll();
List<Produto> livrosEbook = ProdutoBuilder.newProduto(TipoPreco.EBOOK, BigDecimal.TEN).more(3).buildAll();
livrosImpressos.stream().forEach(produtoDao::gravar);
livrosEbook.stream().forEach(produtoDao::gravar);
BigDecimal valor = produtoDao.somaPrecosPorTipo(TipoPreco.EBOOK);
Assert.assertEquals(new BigDecimal(40).setScale(2), valor);
}
}