首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Jmockit模拟addMessage方法的FacesContext

Jmockit模拟addMessage方法的FacesContext
EN

Stack Overflow用户
提问于 2017-03-01 15:45:40
回答 1查看 318关注 0票数 2

我正在为我的bean编写组件测试,并且由于来自NullPointerExceptions的addMessage()方法,我不断地获得FacesContext

我确信这是因为addMessage()方法,因为如果我删除这一行,测试就会通过。如何模拟addMessage()方法?

TrendBean

代码语言:javascript
复制
@Named(value = "trendBean")
@ViewScoped
@SuppressWarnings("deprecation")
public class TrendBean extends AbstractBean implements Serializable {

private static final long serialVersionUID = -310401000218411384L;

private static final Logger logger = Logger.getLogger(TrendBean.class);

private ChartPoint point;

private List<ChartPoint> points;

@Inject
private ITrendManager manager;


public String addChartPoint() {
     if (!isLoggedIn()) {
        return null;
     }
     assertNotNull(point);
     final User user = getSession().getUser();
     manager.addPointToUser(user, point);
     FacesContext.getCurrentInstance().addMessage(
            null,
            new FacesMessage(FacesMessage.SEVERITY_INFO,
                getTranslation("pointAdded"), ""));
     init();
     return null;
     }
 }

TrendBeanTest

代码语言:javascript
复制
public class TrendBeanTest {

@Tested
TrendBean trendBean;
@Injectable
LoginBean loginBean;
@Injectable
Session session;
@Injectable
ITrendManager manager;
@Injectable
IUserManager userManager;
@Injectable
User user;

@Test
public void testAddChartPoint(@Mocked FacesContext fakeContext) {

    new NonStrictExpectations() {

        {
            session.isLoggedIn();
            result = true;
            session.getUser();
            result = user;
            manager.addPointToUser((User) any, (ChartPoint) any);
            FacesContext.getInstance();
            result = fakeContext;
        };
    };

    Deencapsulation.setField(trendBean, "point", new ChartPoint());

    assertEquals(null, trendBean.addChartPoint());

    }
}

AbstractBean

代码语言:javascript
复制
public abstract class AbstractBean {

private static final Logger logger = Logger.getLogger(AbstractBean.class);

@Inject
private Session session;


public boolean isLoggedIn() {
    return session.isLoggedIn();
}

protected Session getSession() {
    return session;
}

public String getTranslation(final String messageKey,
        final Object... formatParameters) {
    return getTranslation(getLanguage(), assertNotNull(messageKey),
            assertWithoutNull(formatParameters));
}

 public static String getTranslation(final Locale locale, final String messageKey,
        final Object... formatParameters) {
    try {
        final ResourceBundle bundle = ResourceBundle.getBundle(
                "internationalization.messages", assertNotNull(locale));
        return getTranslation(bundle, assertNotNull(messageKey),
                assertNotNull(formatParameters));
    } catch (final MissingResourceException e) {
        assertNotNull(logger)
                .error(String.format(
                        "Severe internationalization error: Internationalization bundle for locale '%s' not found!",
                        locale.toString()), e);
    }
    return String.format("No message found for key '%s'!", messageKey);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-04 13:18:43

在本例中,与对FacesContext.getCurrentInstance().addMessage的调用一样,您还将调用AbstractBean .getTranslation(String),您还需要模拟该方法。

就像这样:

TrendBeanTest

代码语言:javascript
复制
public class TrendBeanTest {

@Tested
TrendBean trendBean;
@Injectable
LoginBean loginBean;
@Injectable
Session session;
@Injectable
ITrendManager manager;
@Injectable
IUserManager userManager;
@Injectable
User user;

@Test
public void testAddChartPoint(@Mocked FacesContext fakeContext, @Mocked AbstractBean abstractBean) {

    new NonStrictExpectations() {

        {
            session.isLoggedIn();
            result = true;
            session.getUser();
            result = user;
            manager.addPointToUser((User) any, (ChartPoint) any);
            FacesContext.getInstance();
            result = fakeContext;
            abstractBean.getMessage(anyString); result = "foo";
        };
    };

    Deencapsulation.setField(trendBean, "point", new ChartPoint());

    assertEquals(null, trendBean.addChartPoint());

    new Verifications(){{
        fakeContext.addMessage(withNull(), (FacesMessage)any); 
    }};
}
}

注意:我是在没有IDE的情况下从头开始做这件事,所以可能是我输入了什么东西。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42536119

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档