Java 如何在Junit测试中避免FaceContext的NullPointerException?

Java 如何在Junit测试中避免FaceContext的NullPointerException?,java,spring,junit,nullpointerexception,message,Java,Spring,Junit,Nullpointerexception,Message,我和我的团队在春季制作了一个Webapp作为一个项目,我们必须测试大部分代码。问题是,我们在很多方法中使用FaceContext消息,并且当我们尝试测试这些方法时,总会在FaceContext消息中得到NullPointerExceptions。 我怎样才能避免或抓住它们 我们当前的解决方案是使用@Test(expect=NullPointerException.class),但这并不是我们真正想要的方式。这在Junit中是可能的还是我需要硒 例如: public boolean validat

我和我的团队在春季制作了一个Webapp作为一个项目,我们必须测试大部分代码。问题是,我们在很多方法中使用
FaceContext
消息,并且当我们尝试测试这些方法时,总会在FaceContext消息中得到
NullPointerException
s。 我怎样才能避免或抓住它们

我们当前的解决方案是使用
@Test(expect=NullPointerException.class)
,但这并不是我们真正想要的方式。这在Junit中是可能的还是我需要硒

例如:

public boolean validateInfo(){
    boolean correct = true;
    if(startDate == null || endDate == null) {
        if(startDate == null)
   FacesContext.getCurrentInstance().addMessage("msg", new FacesMessage(FacesMessage.SEVERITY_ERROR, "Gib ein Startdatum an!", ""));
        if(endDate == null)             FacesContext.getCurrentInstance().addMessage("msg", new FacesMessage(FacesMessage.SEVERITY_ERROR, "Gib ein Enddatum an!", ""));

        return false;
    }
    if(startDate.after(endDate)) {
        FacesContext.getCurrentInstance().addMessage("msg", new FacesMessage(FacesMessage.SEVERITY_ERROR, "Startdatum muss vor dem Enddatum sein!", ""));
        correct = false;
    }

    if(maxChildren < 1) {
        FacesContext.getCurrentInstance().addMessage("msg", new FacesMessage(FacesMessage.SEVERITY_ERROR, "Max. Kinderanzahl muss größer 0 sein!", ""));
        correct = false;
    }

    if(bringTime.after(pickupTime)) {
        FacesContext.getCurrentInstance().addMessage("msg", new FacesMessage(FacesMessage.SEVERITY_ERROR, "Bringzeit muss vor dem Abholzeit sein!", ""));
        correct = false;
    }
    return correct;
}
public boolean validateInfo(){
布尔正确=真;
if(startDate==null | | endDate==null){
if(startDate==null)
FacesContext.getCurrentInstance().addMessage(“msg”,新的FacesMessage(FacesMessage.SEVERITY_错误,“Gib ein Startdatum an!”,”);
如果(endDate==null)FacesContext.getCurrentInstance().addMessage(“msg”,新FacesMessage(FacesMessage.SEVERITY_ERROR,“Gib ein Enddatum an!”,”);
返回false;
}
如果(开始日期之后(结束日期)){
FacesContext.getCurrentInstance().addMessage(“msg”,新的FacesMessage(FacesMessage.SEVERITY_错误,“Startdatum muss vor dem Enddatum sein!”,”);
正确=错误;
}
if(maxChildren<1){
FacesContext.getCurrentInstance().addMessage(“msg”,新的FacesMessage(FacesMessage.SEVERITY_ERROR,“Max.Kinderanzahl muss größer 0 sein!”,”);
正确=错误;
}
if(在(拾取时间)之后的时间){
FacesContext.getCurrentInstance().addMessage(“msg”,新的FacesMessage(FacesMessage.SEVERITY_错误,“Bringzeit muss vor dem Abholzeit sein!”,”);
正确=错误;
}
返回正确;
}

它转到第一条FaceContext消息并抛出一个
NullPointerException
。有人能帮忙吗?StackOverflow的其他解决方案没有帮助。

很简单:您的生产代码正在调用一个可能返回null的静态方法

您可以使用PowerMock或JMockit等框架来模拟该静态调用


当然,更好的方法是避免静态调用,而是依赖依赖依赖注入。因为模仿静态内容被认为是一种糟糕的做法。因此,更好的方法是将生产代码更改为更易于测试,而不是求助于此类框架来“修复”设计问题

简单:您的生产代码正在调用一个可能返回null的静态方法

您可以使用PowerMock或JMockit等框架来模拟该静态调用


当然,更好的方法是避免静态调用,而是依赖依赖依赖注入。因为模仿静态内容被认为是一种糟糕的做法。因此,更好的方法是将生产代码更改为更易于测试,而不是求助于此类框架来“修复”设计问题

问题在于facesContext不是单例,在运行时启动请求。 Junit无法自行处理该请求,它需要进行模拟或插入。在此处查看有关facescontext的更多信息

这是javadoc

问题在于,facesContext不是单例,在运行时启动请求。 Junit无法自行处理该请求,它需要进行模拟或插入。在此处查看有关facescontext的更多信息

这是javadoc

要添加到@JasonD,建议通过调用
FacesContext#getCurrentInstance()
来调用它,因为它具有性能和功能含义

另外,不要将验证逻辑直接绑定到代码中,请使用JSR349-Bean验证,因为它定义了用于实体和方法验证的元数据模型和API


要添加到@JasonD,建议通过调用
FacesContext#getCurrentInstance()
来调用它,因为它具有性能和功能含义

另外,不要将验证逻辑直接绑定到代码中,请使用JSR349-Bean验证,因为它定义了用于实体和方法验证的元数据模型和API


您是如何启动该计划的?你是在某个本地服务器上托管的吗?你是如何启动该程序的?你是在某个本地服务器上托管的吗?实际上没有看到你的答案!我也喜欢,我会竖起大拇指的!我很好,今天把我踢出了每日上限!其实没有看到你的答案!我也喜欢,我会竖起大拇指的!我很好,今天把我踢出了每日上限!