Java EntityManager выдает исключение NullPointerException

#java #hibernate #jpa #intellij-idea

#java #спящий режим #jpa #intellij-идея

Вопрос:

Когда я пытаюсь запустить модульный тест для этого класса DAO, я получаю исключение NullPointerException при возврате GetById. Я знаю, что класс не инициализирует EntityManager, но я не понимаю, почему? — Я не могу сказать, является ли мой persistence.xml неправильная конфигурация или неверные учетные данные базы данных.

Я видел два или более потоков StackOverflow, но мне не повезло. Я использую Intellij IDE.

 package com.beetlehand.model.dao;

import com.beetlehand.model.AttributeEntity;
import org.apache.commons.lang.StringUtils;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery;
import java.util.List;
import java.util.Map;
import java.util.ArrayList;

@Stateless
public class AttributeDao extends AbstractDao<AttributeEntity> {

    @PersistenceContext(unitName = "NewPersistenceUnit")
    protected EntityManager entityManager;

    public AttributeEntity getById(Long id) {
        if(id == null) return null;
        return entityManager.find(AttributeEntity.class, id);
    }

    /*** more code ***/ 
}
  

Файл конфигурации сохранения

 <?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">

    <persistence-unit name="NewPersistenceUnit">
        <class>com.beetlehand.model.AttributeEntity</class>
        <class>com.beetlehand.model.AttributeValueEntity</class>
        <class>com.beetlehand.model.AuditEntity</class>
        <class>com.beetlehand.model.CategoryEntity</class>
        <class>com.beetlehand.model.CustomerEntity</class>
        <class>com.beetlehand.model.DepartmentEntity</class>
        <class>com.beetlehand.model.OrderDetailEntity</class>
        <class>com.beetlehand.model.OrdersEntity</class>
        <class>com.beetlehand.model.ProductEntity</class>
        <class>com.beetlehand.model.ProductAttributeEntity</class>
        <class>com.beetlehand.model.ProductCategoryEntity</class>
        <class>com.beetlehand.model.ReviewEntity</class>
        <class>com.beetlehand.model.ShippingEntity</class>
        <class>com.beetlehand.model.ShippingRegionEntity</class>
        <class>com.beetlehand.model.ShoppingCartEntity</class>
        <class>com.beetlehand.model.TaxEntity</class>
        <properties>
            <property name="toplink.jdbc.url" value="jdbc:mysql://localhost:3306/beetlehand"/>
            <property name="toplink.jdbc.driver" value="com.mysql.jdbc.Driver"/>
            <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/beetlehand"/>
            <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
            <property name="openjpa.ConnectionURL" value="jdbc:mysql://localhost:3306/beetlehand"/>
            <property name="openjpa.ConnectionDriverName" value="com.mysql.jdbc.Driver"/>
            <property name="eclipselink.jdbc.url" value="jdbc:mysql://localhost:3306/beetlehand"/>
            <property name="eclipselink.jdbc.driver" value="com.mysql.jdbc.Driver"/>

            <property name="hibernate.connection.username" value="username"/>
            <property name="hibernate.connection.password" value="password"/>

        </properties>
    </persistence-unit>
</persistence>
  

Комментарии:

1. Ваш тест? Знаете ли вы, что вам нужна какая-то тестовая платформа, которая инициализирует некоторый тестовый контейнер, который затем инициализирует любой EJB и т. Д. Материал? Простого, например, JUnit недостаточно.

2. Нет, я не знаком. Я новичок в Java. Есть ли учебное пособие, которое вы можете порекомендовать?

3. Java и JavaEE — это не одно и то же. JavaEE больше похоже на расширение Java, для которого требуется среда выполнения (контейнер), которая предоставляет такие вещи, как CDI (inject EntityManager), JPA и так далее. На самом деле это не какой-либо справочный сайт-учебник, но для начала вы можете искать такие вещи, как 1) модульное тестирование и насмешка 1) Тестирование интеграции J2EE. Вариант 1) означает, что вы можете на самом деле не тестировать вещи, связанные с J2EE, а имитировать эту часть, например, результаты запроса к БД. Вариант 2) означает, что вы используете тестовую среду J2EE, которая выполняет те же действия, что и контейнер, в котором вы развертываете свое приложение.

4. Спасибо, Пирхо — я вчитываюсь в это

Ответ №1:

Вам нужно издеваться над тем, что вам нужно сделать, как показано ниже. entityManager entityManager.find()

 @Mock // Mocking enitt
private EntityManager entityManager;

public AttributeEntity entity = new AttributeEntity();
// Stubbing for entityManager.find()
Mockito.when(entityManager.find(Mockito.any(AttributeEntity.class), Mockito.any())).thenReturn(entity);