2016-03-16 71 views
0

我學習寫單元測試對於具有ManangedBeans和會話Bean我的JSF項目如何與會話Bean的Mockito單元測試

我從的Mockito測試現在

package Test; 

import ejb.CountrySession; 
import java.io.Serializable; 
import javax.ejb.EJB; 
import javax.inject.Named; 
import javax.faces.view.ViewScoped; 

@Named(value = "countryMB") 
@ViewScoped 
public class CountryMB implements Serializable { 

@EJB 
private CountrySession countSession; 
// 
private String countryName; 
// 
private StatusMsg msg; 

public CountryMB() { 
} 

public void setMsg(StatusMsg msg) { 
    this.msg = msg; 
} 

public void setCountSession(CountrySession countSession) { 
    this.countSession = countSession; 
} 

public String getCountryName() { 
    return countryName; 
} 

public void setCountryName(String countryName) { 
    this.countryName = countryName; 
} 

public void ajaxAll() { 

} 

public void saveCountry() { 
    if (countryName != null && !countryName.trim().isEmpty()) { 
     boolean chk = countSession.chkCountry(countryName); 
     if (!chk) { 
      chk = countSession.addCountry(countryName); 
      if (chk) { 
       msg.addInfo("Add Country", "New Country added"); 
      } else { 
       msg.addError("Add Country", "Unable to add Country"); 
      } 
     } else { 
      msg.addWarn("Add Country", "Country already exists"); 
     } 
    } else { 
     msg.addWarn("Add Country", "Required parameter not available"); 
    } 
} 

} 

調用EJB的問題在我的測試代碼,我有以下

package Test; 

import ejb.CountrySession; 
import entities.Country; 
import java.util.List; 
import javax.persistence.EntityManager; 
import javax.persistence.Query; 
import org.junit.After; 
import org.junit.Assert; 
import org.junit.Before; 
import org.junit.Test; 
import org.mockito.Mock; 
import org.mockito.Mockito; 
import org.mockito.MockitoAnnotations; 
import static org.mockito.Mockito.mock; 
import static org.mockito.Mockito.verify; 

public class CountryMBTest { 

@Mock 
private CountryMB countryMB; 
@Mock 
private StatusMsg sm; 

@Mock 
private CountrySession countSession; 

@Mock 
private EntityManager em; 

@Mock 
private Query qry; 

@Before 
public void setup() { 
    MockitoAnnotations.initMocks(this); 
    countryMB = new CountryMB(); 
    countryMB.setMsg(sm); 
    countryMB.setCountSession(countSession); 
} 

@After 
public void after() { 
    countryMB = null; 
} 

@Test 
public void infoCountrySave() { 
    countryMB.setCountryName("Test"); 
    countryMB.saveCountry(); 
    verify(sm).addInfo("Add Country", "New Country added"); 
} 

@Test 
public void errorCountrySave() { 
    countryMB.setCountryName("Test"); 
    countryMB.saveCountry(); 
    verify(sm).addError("Add Country", "Unable to add Country"); 
} 

@Test 
public void warnCountrySave() { 
    countryMB.setCountryName("Test"); 
    countryMB.saveCountry(); 
    verify(sm).addWarn("Add Country", "Country already exists"); 
} 

@Test 
public void chkCountSave() { 
    List<Country> countLst = null; 
    Country dum = mock(Country.class); 
    EntityManager em = mock(EntityManager.class); 
    Mockito.when(em.find(Country.class, 111)).thenReturn(dum); 
    CountrySession cs = Mockito.mock(CountrySession.class); 
    Mockito.when(cs.chkCountry("Test")).thenCallRealMethod(); 
    Mockito.when(cs.getEm()).thenReturn(em); 
    String name = "Test"; 
    Assert.assertNull(cs.chkCountry(name)); 
} 

} 

我的表只有一個記錄PK = 1,國家=測試

上述測試代碼永遠不會檢查會話bean,它只是把

java.lang.NullPointerException 
at ejb.CountrySession.chkCountry(CountrySession.java:67) 
at Test.CountryMBTest.chkCountSave(CountryMBTest.java:112) 

而對於infoCountrySave()& warnCountrySave(),它只是從來沒有檢查數據庫所提供的價值。

因爲我從來沒有使用任何單元測試較早,所以我真的不知道我在做什麼是正確的,而且我無法通過在google找出任何工作代碼。

這將是很大的幫助,如果任何人都可以指導我一些資源可在網上,甚至讓我知道什麼是我需要糾正得到與EJB部分上述測試的Mockito工作。

回答

0

變化@Mock@InjectMocks

private CountryMB countryMB 

,當你得到java.lang.NullPointerException。主要是你錯過注入由被稱爲某個類或某些依賴when