Как внедрить PersistenceContext во время модульного тестирования? - PullRequest
15 голосов
/ 28 сентября 2010

Это мой класс Java:

public class Finder {
  @PersistenceContext(unitName = "abc")
  EntityManager em;
  public boolean exists(int i) {
    return (this.em.find(Employee.class, i) != null);
  }
}

Это модульный тест:

public class FinderTest {
  @Test public void testSimple() {
    Finder f = new Finder();
    assert(f.exists(1) == true);
  }
}

Тестирование завершается неудачно с NullPointerException, поскольку Finder.em не вводится никем.Как я должен справиться с этой ситуацией правильно?Существует ли лучшая практика?

Ответы [ 2 ]

13 голосов
/ 28 сентября 2010

Без контейнера, такого как Spring (или что-то вроде Unitils - основанного на Spring), вам придется внедрить менеджер сущностей вручную. В этом случае вы могли бы использовать что-то вроде этого в качестве базового класса:

public abstract class JpaBaseRolledBackTestCase {
    protected static EntityManagerFactory emf;

    protected EntityManager em;

    @BeforeClass
    public static void createEntityManagerFactory() {
        emf = Persistence.createEntityManagerFactory("PetstorePu");
    }

    @AfterClass
    public static void closeEntityManagerFactory() {
        emf.close();
    }

    @Before
    public void beginTransaction() {
        em = emf.createEntityManager();
        em.getTransaction().begin();
    }

    @After
    public void rollbackTransaction() {   
        if (em.getTransaction().isActive()) {
            em.getTransaction().rollback();
        }

        if (em.isOpen()) {
            em.close();
        }
    }
}
4 голосов
/ 28 сентября 2010

Это зависит от что вы хотите проверить.Если у вас есть сложная бизнес-логика в вашем классе Finder, вы можете захотеть смоделировать EntityManager - с использованием среды моделирования, такой как EasyMock или Mockito - чтобы протестировать эту логику,

Теперь, поскольку это не тот случай, я подозреваю, что вы хотите проверить постоянство объекта Employee (это часто называют интеграционное тестирование ).Это требует использования базы данных.Чтобы упростить тестирование и сделать ваши тесты переносимыми, вы можете использовать для этой цели базу данных в памяти, например HSQLDB .Чтобы запустить HSQLDB, создать постоянный контекст и внедрить этот контекст в класс Finder, рекомендуется использовать среду IoC, такую ​​как Spring .

В Интернете существует множество учебных пособий, объясняющих, как использовать JPA / Spring / HSQLDB.Взгляните на этот пример проекта: Интеграционное тестирование с Maven 2, Spring 2.5, JPA, Hibernate и HSQLDB

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...