我正在尝试为使用 JPA 的简单 java 程序运行 JUnit 测试,但总是出现以下错误:
Testcase: testGetSummary(logic.rezepteVerwaltenTest): Caused an ERROR
null
java.lang.NullPointerException
at logic.rezepteVerwalten.getSummary(rezepteVerwalten.java:41)
at logic.rezepteVerwaltenTest.testGetSummary(rezepteVerwaltenTest.java:56)
我有两个问题:
- 问题出在哪里?(显而易见的问题,不是吗:-))
- 如何从 JUnit 测试中获得更详细的堆栈跟踪
顺便说一句:如果我通过 JSF 调用方法,它会很好地工作。
我将不胜感激任何帮助!谢谢!
JUnit 测试:
package logic;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.*;
import javax.ejb.EJB;
public class rezepteVerwaltenTest {
@EJB
private rezepteVerwalten rezepte = new rezepteVerwalten();
public rezepteVerwaltenTest() {
}
@BeforeClass
public static void setUpClass() {
}
@AfterClass
public static void tearDownClass() {
}
@Before
public void setUp() {
}
@After
public void tearDown() {
}
/**
* Test of getSummary method, of class rezepteVerwalten.
*/
@Test
public void testGetSummary() {
System.out.println("getSummary");
rezepte.getSummary();
assert(true);
}
}
班上:
package logic;
import javax.ejb.Stateless;
import entity.rezepte;
import facades.*;
import helper.Calculate;
import interfaces.Logger;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import logic.RezepteLogger;
@ManagedBean(name = "rezepteVerwalten")
@RequestScoped
public class rezepteVerwalten {
@EJB
private rezepteFacade rezepteFacade;
@EJB
private Logger logger;
private String name;
private String zubereitung;
private String summary;
public String getSummary() {
List<rezepte> rezepte = rezepteFacade.findAll();
List<String> rez = new ArrayList<String>();
for (int i = 0; i<rezepte.size();i++) {
String output = rezepte.get(i).toString()+" "+ rezepte.get(i).getRezeptName()+": "+rezepte.get(i).getRezeptZubereitung();
rez.add(output);
}
return rez.toString();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getZubereitung() {
return zubereitung;
}
public void setZubereitung(String zubereitung) {
this.zubereitung = zubereitung;
}
public void rezepteVerwalten() {
this.name ="";
this.zubereitung="";
}
public void rezepteVerwalten(String name, String zubereitung) {
this.name = name;
this.zubereitung = zubereitung;
}
public String createRezept() {
rezepte rezept = new rezepte();
rezept.setRezeptName(name);
rezept.setRezeptZubereitung(zubereitung);
rezepteFacade.create(rezept);
return "theend";
}
public void listRezepte() {
List<rezepte> rezepte = rezepteFacade.findAll();
List<String> rez = new ArrayList<String>();
for (int i = 0; i<rezepte.size();i++) {
String output = rezepte.get(i).toString()+" "+ rezepte.get(i).getRezeptName()+": "+rezepte.get(i).getRezeptZubereitung();
rez.add(output);
logger.logIt(output);
logger.logIt(Calculate.calculateMenge(2, i+1, 5).toString());
}
}
}
实体:
package entity;
import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class rezepte implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String rezeptName;
private String rezeptZubereitung;
public String getRezeptName() {
return rezeptName;
}
public void setRezeptName(String rezeptName) {
this.rezeptName = rezeptName;
}
public String getRezeptZubereitung() {
return rezeptZubereitung;
}
public void setRezeptZubereitung(String rezeptZubereitung) {
this.rezeptZubereitung = rezeptZubereitung;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@Override
public int hashCode() {
int hash = 0;
hash += (id != null ? id.hashCode() : 0);
return hash;
}
@Override
public boolean equals(Object object) {
// TODO: Warning - this method won't work in the case the id fields are not set
if (!(object instanceof rezepte)) {
return false;
}
rezepte other = (rezepte) object;
if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
return false;
}
return true;
}
@Override
public String toString() {
return "entity.rezepte[ id=" + id + " ]";
}
}
和外墙:
package facades;
import entity.rezepte;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
@Stateless
public class rezepteFacade extends AbstractFacade<rezepte> {
@PersistenceContext(unitName = "RezeptePU")
private EntityManager em;
@Override
protected EntityManager getEntityManager() {
return em;
}
public rezepteFacade() {
super(rezepte.class);
}
}
package facades;
import java.util.List;
import javax.persistence.EntityManager;
public abstract class AbstractFacade<T> {
private Class<T> entityClass;
public AbstractFacade(Class<T> entityClass) {
this.entityClass = entityClass;
}
protected abstract EntityManager getEntityManager();
public void create(T entity) {
getEntityManager().persist(entity);
}
public void edit(T entity) {
getEntityManager().merge(entity);
}
public void remove(T entity) {
getEntityManager().remove(getEntityManager().merge(entity));
}
public T find(Object id) {
return getEntityManager().find(entityClass, id);
}
public List<T> findAll() {
javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
cq.select(cq.from(entityClass));
return getEntityManager().createQuery(cq).getResultList();
}
public List<T> findRange(int[] range) {
javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
cq.select(cq.from(entityClass));
javax.persistence.Query q = getEntityManager().createQuery(cq);
q.setMaxResults(range[1] - range[0]);
q.setFirstResult(range[0]);
return q.getResultList();
}
public int count() {
javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
javax.persistence.criteria.Root<T> rt = cq.from(entityClass);
cq.select(getEntityManager().getCriteriaBuilder().count(rt));
javax.persistence.Query q = getEntityManager().createQuery(cq);
return ((Long) q.getSingleResult()).intValue();
}
}