JPAサンプルのテストケース

前回作ったエンティティを、NetBeansを使って、jUnitします。

前回のエンティティをテストします。テスト環境は、JDK SE 5 + Hibernate EntityManager + Postgres 8.1 を使ってます(JavaEE コンテナは使いません)。

NetBeansなら

テスト実行時のクラスパスは、プロジェクトプロパティで設定します。persistence.xmlがあるディレクトリ(conf)と、HibernateEMのライブラリ、JDBCをクラスパスに追加します。



あとは、テストケースのソースコードを開いて、「Shift+F6」を押すだけ。

テストパス後のPostgreSQLに生成されたテーブルは、NetBeans付属のDBエクスプローラーで確認できます。ランタイムタブから開きます。このあたりのDBまわりの環境設定は、こちらの記事も参考にしてください。



やっぱりNetBeansは、いろんな意味でラクチンです。必要なものはそろってる。

persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
  http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">

 <persistence-unit name="sandboxPU"
   transaction-type="RESOURCE_LOCAL">
  <provider>org.hibernate.ejb.HibernatePersistence</provider>
  <class>ProductStock</class>
  <class>Product</class>
  <exclude-unlisted-classes>true</exclude-unlisted-classes>
    ↑クラスパス内のエンティティを自動で見つけるなら、false
  <properties>
    <property name="hibernate.dialect"
      value="org.hibernate.dialect.PostgreSQLDialect"/>
    <property name="hibernate.connection.url"
      value="jdbc:postgresql://localhost:5432/sandbox"/>
    <property name="hibernate.connection.driver_class"
      value="org.postgresql.Driver"/>
    <property name="hibernate.connection.password"
      value="********"/>
    <property name="hibernate.connection.username"
      value="********"/>
    <property name="hibernate.cache.provider_class"
      value="org.hibernate.cache.NoCacheProvider"/>
    <property name="hibernate.hbm2ddl.auto"
      value="create-drop"/>
       ↑必要なテーブルを自動で作成削除してくれる。
  </properties>
 </persistence-unit>
</persistence>

テストケース

public class EntityTestCase extends TestCase {

  private EntityManagerFactory emf;
  protected EntityManager getEM() {
    return emf.createEntityManager();
  }

  public EntityTestCase(String testName) {
    super(testName);
    emf = Persistence.createEntityManagerFactory("sandboxPU");
  }
}

public class ProductStockTest extends EntityTestCase {

  public ProductStockTest(String testName) {
    super(testName);
  }

  public void testCascadePersistAndFind() throws Exception{

    ProductStock stock = new ProductStock();
    stock.setAmount(100);
    stock.setUpdatedAt(new java.util.Date());

    Product product = new Product();
    product.setName("美肌化粧水");
    product.setProductStock(stock);

    //↑ここまでは、ただのPOJO
    EntityManager em = getEM();
    //↓ここからEntityに変身する。

    try{
      em.getTransaction().begin();
      em.persist(product);
      em.getTransaction().commit();
    } catch (Exception ex) {
      em.getTransaction().rollback();
      throw ex;
    }
    em.close();

    em = getEM();
    Product productFromDB= em.find(Product.class, product.getId());
    assertEquals("DBからfindしたproductの検査"
      ,product,productFromDB);

    ProductStock stockFromProduct
        =productFromDB.getProductStock();
    assertEquals("productからgetしたstockの検査"
      ,stock,stockFromProduct);

    ProductStock stockFromDB= em.find(ProductStock.class
      , productFromDB.getProductStock().getId());
    assertEquals("DBからfindしたstockの検査"
      ,stock,stockFromDB);

    Product productFromStock= stockFromProduct.getProduct();
    assertEquals("stockからgetしたproductの検査1"
       ,product,productFromStock);

    Product productFromStock2=stockFromDB.getProduct();
    assertEquals("stockからgetしたproductの検査2"
      ,product,productFromStock2);

    em.close();
  }
}


コメント

コメントしてください

closed.