如何对实现ServletContextListener的类进行单元测试,该类负责初始化EntityManagerFactory?

时间:2015-08-10 19:43:38

标签: java unit-testing java-ee junit servletcontextlistener

所以我有这个实现:

package biz.tugay.books10Aug.dao;
/* User: koray@tugay.biz Date: 10/08/15 Time: 22:22 */

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

public class PersistenceUtil {

    private static EntityManagerFactory entityManagerFactory;

    public static void initalizeEntityManagerFactory() {
        if (entityManagerFactory == null || !entityManagerFactory.isOpen()) {
            entityManagerFactory = Persistence.createEntityManagerFactory("bookshop");
        }
    }

    public static EntityManagerFactory getEntityManagerFactory() {
        return entityManagerFactory;
    }

    public static EntityManager getEntityManager() {
        if (entityManagerFactory == null || !entityManagerFactory.isOpen()) {
            initalizeEntityManagerFactory();
        }
        EntityManager entityManager = entityManagerFactory.createEntityManager();
        return entityManager;
    }

    public static void closeEntityManagerFactory() {
        entityManagerFactory.close();
    }

}

当我启动我的网络应用程序时,我希望EntityManagerFactory准备好,所以我有这个监听器:

package biz.tugay.books10Aug.web;
/* User: koray@tugay.biz Date: 10/08/15 Time: 22:24 */

import biz.tugay.books10Aug.dao.PersistenceUtil;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

@WebListener
public class BookShopServletContextListener implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        PersistenceUtil.initalizeEntityManagerFactory();
    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        PersistenceUtil.closeEntityManagerFactory();
    }

}

如何正确地对此监听器进行单元测试?这就是我所拥有的,但我不确定它是否有用:

package biz.tugay.books10Aug;
/* User: koray@tugay.biz Date: 10/08/15 Time: 22:28 */

import biz.tugay.books10Aug.dao.PersistenceUtil;
import biz.tugay.books10Aug.web.BookShopServletContextListener;
import org.junit.Assert;
import org.junit.Test;

import javax.persistence.EntityManagerFactory;

public class BookShopServletContextListenerTest {

    @Test
    public void shouldCreateEntityManagerFactoryWithoutAnyExceptions() throws Exception {
        BookShopServletContextListener bookShopServletContextListener
                = new BookShopServletContextListener();
        bookShopServletContextListener.contextInitialized(null);
    }

    @Test
    public void testContextDestroyed() throws Exception {
        BookShopServletContextListener bookShopServletContextListener
                = new BookShopServletContextListener();
        bookShopServletContextListener.contextInitialized(null);
        bookShopServletContextListener.contextDestroyed(null);
        EntityManagerFactory entityManagerFactory = PersistenceUtil.getEntityManagerFactory();
        Assert.assertTrue(!entityManagerFactory.isOpen());
    }

}

1 个答案:

答案 0 :(得分:0)

我会使用@PeristentUnit自动注入EntityManagerFactory。在这种情况下,无需创建特定的ServletListener,从而对其进行测试。