繁体   English   中英

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

[英]How to avoid a NullPointerException from FaceContext in Junit tests?

我和我的团队在春季将Webapp作为一个项目进行了开发,我们必须测试大多数代码。 问题在于我们在很多方法中使用FaceContext消息,并且总是在尝试测试这些方法时,在FaceContext-Messages处获得NullPointerException 我如何避免或抓住它们?

我们当前的解决方案是使用@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;
}

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

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

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

当然,更好的方法是避免该静态调用,而是依赖于依赖项注入。 由于嘲笑静态内容被认为是不良做法。 因此,更好的方法是更改​​生产代码以使其更易于测试,而不是借助此类框架来“解决”您的设计问题。

问题是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

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

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

Hibernate有一个实现和关于测试验证约束的良好文档

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM