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

时间:2017-06-19 18:05:13

标签: java spring junit nullpointerexception message

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

我们目前的解决方案是使用@Test(expect = NullPointerException.class),但这不是我们想要的方式。这在Junit是可能的还是我需要Selenium?

一个例子是:

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

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

3 个答案:

答案 0 :(得分:1)

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

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

当然,更好的方法是避免静态调用并依赖依赖注入。嘲弄静态的东西被认为是一种不好的做法。因此,更好的方法是将生产代码更改为更容易测试,而不是转向此类框架来“修复”您的设计问题。

答案 1 :(得分:1)

问题是facesContext不是单例,并在运行时启动请求。 Junit本身无法处理该请求,它需要被模拟或存根。请参阅这里有关facescontext的更多信息

http://illegalargumentexception.blogspot.com/2011/12/jsf-mocking-facescontext-for-unit-tests.html

这是javadoc http://docs.oracle.com/javaee/6/api/javax/faces/context/FacesContext.html

答案 2 :(得分:0)

要添加到@JasonD,它建议传递FacesContext#getCurrentInstance()作为调用它,因为它具有性能和功能含义。

也不要将验证逻辑直接捆绑到您的代码中,使用JSR 349 - Bean Validation-因为它定义了元数据模型和实体和方法验证的API。

Hibernate has an implementation and a good documentation on testing validation constraints