我正在尝试测试我的代码的一部分,在某些情况下最终会调用
FacesContext.getCurrentInstance()
并且我们不在 jsf 上下文中,它给出 null 并且我收到一个 NullPointerExcetption
我如何测试该部分?
我的代码
测试方法
@Test
void testCambiarNombre() {
ModificarUsuarioBean modificarUsuarioBean = new ModificarUsuarioBean();
modificarUsuarioBean.setFachada(fachada);
modificarUsuarioBean.init();
modificarUsuarioBean.getUsuario().setNombre(null);
modificarUsuarioBean.cambiarNombre(); // Here is the problem. See code of method below
assertTrue(fachada.existeUsuario("admin", null));
}
ModificarUsuarioBean.cambiarNombre
public void cambiarNombre() {
if(StringUtils.isBlank(usuario.getNombre())) {
FacesMessagesUtils.mostrarMensajeDelProperties("usuario.accion.cambiarNombre.error.VACIO", "comun.ERROR", FacesMessage.SEVERITY_WARN); // Here is the problem. See code of method below
} else {
if(fachada.modificarNombreUsuario(usuario)) {
FacesContext context = FacesContext.getCurrentInstance();
UsuarioLogueadoBean usuarioLogueadoBean = (UsuarioLogueadoBean)context.getExternalContext().getSessionMap().get("usuarioLogueadoBean");
usuarioLogueadoBean.getUsuario().setNombre(usuario.getNombre());
FacesMessagesUtils.mostrarMensajeDelProperties("usuario.accion.cambiarNombre.OK", "comun.EXITO", FacesMessage.SEVERITY_INFO);
} else {
FacesMessagesUtils.mostrarMensajeDelProperties("usuario.accion.cambiarNombre.error.REPETIDO", "comun.ERROR", FacesMessage.SEVERITY_WARN);
}
}
}
FacesMessagesUtils.mostrarMensajeDelProperties
public static void mostrarMensajeDelProperties(String keyMensaje, String keyCabecera,
FacesMessage.Severity severidad) {
FacesMessage msg = new FacesMessage(severidad, MessageUtils.obtenerMensajeDelProperties(keyCabecera),
MessageUtils.obtenerMensajeDelProperties(keyMensaje));
FacesContext.getCurrentInstance().addMessage(null, msg); // Here is the NullPointerException
}
pom.xml
<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-engine -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.9.3</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mockito/mockito-core -->
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>5.3.1</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mockito/mockito-junit-jupiter -->
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-junit-jupiter</artifactId>
<version>5.3.1</version>
<scope>test</scope>
</dependency>
我的Java操作系统版本是8
FacesContext.getCurrentInstance()
是静态方法。所以MockedStatic
可以用来测试所需的流量
@Test
void testCambiarNombre() {
try (MockedStatic<FacesContext> context = mockStatic(FacesContext.class)) {
FacesContext facesContext = mock(FacesContext.class);
context.when(FacesContext::getInstance()).thenReturn(facesContext);
when(facesContext.getExternalContext()..).thenReturn(..)
//...
}
}