【问题标题】:how to Mockito unit test with Session Beans如何使用 Session Beans 进行 Mockito 单元测试
【发布时间】:2016-03-16 11:43:13
【问题描述】:

我正在学习为我的 JSF 项目编写一个 UnitTest,其中包含 ManangedBeans 和 Session Beans

我在从 Mockito 测试调用 EJB 时遇到问题

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");
    }
}

}

现在在我的测试代码中,我有以下内容

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

}

我的表只有一个 Record pk=1, Country=Test

上面的测试代码从不检查会话 bean,它只是抛出

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

对于 infoCountrySave() 和 warnCountrySave(),它永远不会检查数据库中提供的值。

由于我之前从未使用过任何 UnitTest,所以我真的不知道我所做的是否正确,而且我无法通过谷歌搜索找到任何工作代码。

如果有人可以指导我找到一些在线可用的资源,或者甚至让我知道我需要纠正什么以使上述 mockito 测试与 ejb 部分一起工作,那将是非常有帮助的。

【问题讨论】:

    标签: java mockito ejb-3.1 managed-bean stateless-session-bean


    【解决方案1】:

    @Mock 更改为@InjectMocks

    private CountryMB countryMB 
    

    当您收到java.lang.NullPointerException 时。大多数情况下,您会错过通过调用 when 注入某些类或某些依赖项

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-22
      • 1970-01-01
      • 1970-01-01
      • 2017-11-22
      • 2017-09-19
      • 2019-04-27
      相关资源
      最近更新 更多