2
respostas

Exception no teste

Olá,

Ao executar o passo a passo da aula, obtive a seguinte exception:

java.lang.IllegalArgumentException: org.hibernate.QueryException: could not resolve property: tipoPreco of: component[tipo,valor] [select sum(preco.valor) from br.com.casadocodigo.loja.models.Produto p join fetch p.precos preco where preco.tipoPreco = :tipoPreco]
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1750)
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1677)
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1683)
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:350)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:289)
    at com.sun.proxy.$Proxy32.createQuery(Unknown Source)
    at br.com.casadocodigo.loja.dao.ProdutoDao.somaPrecosPorTipo(ProdutoDao.java:43)

Agora é a query do Hibernate que tá errada. Antes dava nullpointerException no BigDecimal.class.

Meu metodo do ProdutoDAO.java

    public BigDecimal somaPrecosPorTipo(TipoPreco tipoPreco) {
        TypedQuery<BigDecimal> query = manager.createQuery("select sum(preco.valor) from Produto p join fetch p.precos preco where preco.tipoPreco = :tipoPreco", BigDecimal.class);

        query.setParameter("tipoPreco", tipoPreco);
        return query.getSingleResult();
    }
2 respostas

Prosseguindo..

Minha classe de teste

package br.com.casadocodigo.loja.dao;

import java.math.BigDecimal;
import java.util.List;

import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional;

import br.com.casadocodigo.loja.builders.ProdutoBuilder;
import br.com.casadocodigo.loja.conf.DataSourceConfigurationTest;
import br.com.casadocodigo.loja.conf.JPAConfiguration;
import br.com.casadocodigo.loja.models.Produto;
import br.com.casadocodigo.loja.models.TipoPreco;

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

    @Autowired
    private ProdutoDao produtoDao;

    @Test
    @Transactional
    public void deveSomarTodosPrecosPorTipoLivro() {
        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);
    }
}

Oi Guilherme, realmente ele está acusando que não existe a propriedade que você está buscando nos objetos da coleção preco... Tem como postar mais pedaços do código ou colocar o link do github? Antes, eu só checaria esse lance da propriedade.