Исключение нулевого указателя во время насмешки получить Entity Manager

Учитывая пример двух классов, я получаю исключение нулевого указателя при попытке смоделировать getEntityManager() в JpaController, кто-то со знанием о mockito, пожалуйста, посоветуйте.

Продукт JPA Контроллер

public class ProductjpaController extends JpaController {

    public ProductjpaController() {
        super(Product.class);
    }

    public Product create(Product product) {
        EntityManager em = null;

        try {
            em = getEntityManager();
            em.getTransaction().begin();
            em.persist(product);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
        return product;
    }
}

Контроллер JPA

    public EntityManager getEntityManager() {

    EntityManagerFactory emf = null;
    Map<String, String> properties = new HashMap<>();
    final String url = "jdbc:mysql://" + getHost(dBModule) + ":" + getPort(dBModule) + "/" + database+"?useSSL=false";
    properties.put("hibernate.connection.url", url);
    properties.put("hibernate.connection.username", getUser(dBModule));
    properties.put("hibernate.connection.password", getPassword(dBModule));
    properties.put("hibernate.ejb.entitymanager_factory_name", database);
    try {
        emf = Persistence.createEntityManagerFactory("templatePU", properties);
    } catch (Exception e) {
        e.printStackTrace(); // strangely, this works, but the next two lines don't
        LOG.log(Level.SEVERE, "unexpected exception", Utilities.getStackTrace(e));
        LOG.log(Level.SEVERE, "cause of unexpected exception", Utilities.getStackTrace(e.getCause()));
    }
    return emf.createEntityManager();
}

1 ответ

Строго говоря, с точки зрения модульного тестирования... что вы хотите проверить? Если вы тестируете ProductJPAController, он только вызывает EntityManager и уже протестирован.

Тем не менее, поскольку JPAController использует статические классы для генерации экземпляра entityManager, будет нелегко смоделировать его с помощью mockito... (Powermock позволит это, но действительно ли это необходимо для его использования?)

Единственное решение, которое я вижу, состоит в том, чтобы шпионить за productJpaControllerInstance, и вам придется высмеивать вызовы:

  • getEntityManager
  • getTransaction (не забудьте смоделировать вызовы метода begin и commit)
  • упорствовать
  • близко

Возврат проверенных элементов для выполнения теста.

Надеюсь, поможет...

Другие вопросы по тегам