我的团队和我在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上的其他解决方案没有帮助。
答案 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