#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);