2011-12-16 143 views
0

我正面臨NullPointerException。 我試圖執行JUnit測試並以某種方式收到NullPointerExceptionJUnit測試;空指針異常

我寫的測試如下:

package edu.city.set.eia.citypress.unittest.beans; 

import edu.city.set.eia.citypress.model.RegisUser; 
import edu.city.set.eia.citypress.beans.RegisUserFacade; 
import org.junit.Test; 
import static org.junit.Assert.*; 

public class RegisUserUTest { 

    private static final String EMAIL = "test_email"; 
    private static final String INVALID_EMAIL = "test_email_invalid"; 

    @Test 
    public void testValidEmail() throws Exception { 
    TestEmail bean = new TestEmail(); 
    RegisUser user = bean.findByEmail(EMAIL); 
    assertNotNull(user); 
    assertEquals(EMAIL, user.getEmail()); 
    } 

    @Test(expected = Exception.class) 
    public void testInValidUser() throws Exception { 
    TestEmail bean = new TestEmail(); 
    bean.findByEmail(INVALID_EMAIL); 
    } 

    private static class TestEmail extends RegisUserFacade { 

    private RegisUser user; 

    public TestEmail() { 
     user = new RegisUser(); 
     user.setEmail(EMAIL); 
    } 

    @Override 
    public RegisUser findUser(String email) { 
     if (email.equals(user.getEmail())) { 
     return user; 
     } 
     return null; 
    } 
    } 
} 

另一方面, 會話bean如下;

package edu.city.set.eia.citypress.beans; 

import edu.city.set.eia.citypress.model.RegisUser; 
import javax.ejb.Stateless; 
import javax.persistence.EntityManager; 
import javax.persistence.PersistenceContext; 
import javax.persistence.Query; 


@Stateless 
public class RegisUserFacade extends AbstractFacade<RegisUser> implements RegisUserFacadeLocal { 
    @PersistenceContext(unitName = "citypress_PU") 
    private EntityManager em; 

    @Override 
    public EntityManager getEntityManager() { 
     return em; 
    } 

    public void setEntityManager(EntityManager em) { 
     this.em = em; 
    } 


    public RegisUserFacade() { 
     super(RegisUser.class); 
    } 


    @Override 
    public RegisUser findByUsername(String username) { 
     Query query = this.getEntityManager().createQuery("select r from RegisUser r where username=:username"); 
     query.setParameter("username", username); 
     RegisUser regisuser; 
     try { 
      regisuser = (RegisUser) query.getSingleResult(); 
     } 
     catch (Exception e){ 
      regisuser = null; 
     } 
     return regisuser; 
    } 

    @Override 
    public RegisUser findByUserPass(String username, String password){ 
     Query query = this.getEntityManager().createNamedQuery("RegisUser.findByUserPass"); 
     query.setParameter("username", username); 
     query.setParameter("password", password); 
     RegisUser regisuser; 

     try { // To prevent javax.persistence.NoResultException 
      regisuser = (RegisUser) query.getSingleResult(); 
     } 
     catch (Exception e){ 
      regisuser = null; 
     } 

     return regisuser; 
    } 

    @Override 
    public RegisUser findByEmail(String email) { 
     Query query = em.createQuery("select r from RegisUser r where r.email = :email"); 
     query.setParameter("email", email); 
     RegisUser regisuser; 
     try { 
      regisuser = (RegisUser) query.getSingleResult(); 
     } 
     catch (Exception e){ 
      regisuser = null; 
     } 
     return regisuser; 
    } 
} 

當我運行測試,它說NullPointerException

java.lang.NullPointerException 
    at edu.city.set.eia.citypress.beans.RegisUserFacade.findByEmail(RegisUserFacade.java:63) 
    at edu.city.set.eia.citypress.unittest.beans.RegisUserUTest.testValidEmail(RegisUserUTest.java:16) 
+0

學習使用調試器。 – 2011-12-19 07:23:16

回答

0

好像em爲空在

Query query = em.createQuery("select r from RegisUser r where r.email = :email"); 

如果這條線是63(行號可以看到在堆棧跟蹤:RegisUserFacade.java:)

0

下面的代碼似乎失敗了。 EntityManager是空的,我沒有看到它被Junit設置。我建議你使用Ejb3Unit如果你想測試它的容器或使用嵌入glassfish。

Query query = this.getEntityManager().createQuery("select r from RegisUser r where username=:username");