¿Cómo me burlo de un JSF FacesContext con un ViewMap para pruebas unitarias fuera de una aplicación web real?

StackOverflow https://stackoverflow.com/questions/7334868

Pregunta

EDITAR: Se limpió la pregunta para facilitar la lectura.Ignore los comentarios hasta el 31 de octubre.

En nuestra pila de aplicaciones trabajamos con muchos módulos jar más pequeños que se combinan en una aplicación web final.Un módulo define las características de JSF, como implementar este Ver alcance.

Ahora, además de las pruebas de integración, queremos poder realizar pruebas unitarias de cada parte y, por lo tanto, necesitamos una forma de simular un contexto de caras completo (al que se puede acceder a través de un contenedor) para probar las clases que lo usan.

La parte importante aquí es completo lo que significa que tiene que tener un inicializado ViewMap ya que aquí es donde nuestro ViewScope pone sus objetos.


He probado diferentes enfoques:

1) prueba de esquisto:He llegado más lejos con esto, pero desafortunadamente el proyecto está retirado.

Hasta ahora he incluido FacesContext en un proveedor que me permite reemplazarlo con un FacesContext simulado para realizar pruebas.También modifiqué la implementación shale de AbstractViewControllerTestCase para incluir un contexto de aplicación.

Sin embargo al llamar MockedFacesContext.getViewRoot().getViewMap() ya que esto arrojará un UnsupportedOperationException.Las razones parecen ser que MockApplication no crea una instancia de Application.defaultApplication (es nulo) que se requiere para esta llamada al método.Esto parece ser una limitación de las pruebas de esquisto.


2) JMock o simulacro Me parece que estos no se burlan de nada en absoluto, ya que la mayoría de los miembros permanecerán nulos.No sé si JMock o Mockito realmente pueden llamar a los métodos de inicialización adecuados.


3) Burlador de caras personalizadas: Para mí, esta parece la única opción que queda, pero realmente no tenemos tiempo para analizar cómo se inicializa Faces y recrear el comportamiento con fines burlones.¿Quizás alguien no haya hecho esto antes y pueda compartir puntos de referencia y trampas importantes?


¿O existe alguna forma alternativa de burlarse de FacesContext fuera de una aplicación web?

¿Fue útil?

Solución

yo iría con PowerMock+Mockito:

Desde tu enlace:

private Map<String,Object> getViewMap() {
    return FacesContext.getCurrentInstance().getViewRoot().getViewMap();
}

En la prueba:

@RunWith(PowerMockRunner.class)
@PrepareForTest({ FacesContext.class });
public class TheTest {
    /*
     * fake viewMap.
     */
    private Map<String,Object> viewMap = Maps.newHashMap() // guava

    /**
     * mock for FaceContext
     */
    @Mock
    private FacesContext faceContext;

    /**
     * mock for UIViewRoot
     */
    @Mock
    private UIViewRoot uiViewRoot;

    @Before
    public void setUp() {
        Mockito.doReturn(this.uiViewRoot).when(this.faceContext).getViewRoot();
        Mockito.doReturn(this.viewMap).when(this.uiViewRoot).getViewMap();

        PowerMock.mockStatic(FacesContext.class);
        PowerMock.doReturn(this.faceContext).when(FacesContext.class, "getCurrentInstance");
    }

    @Test
    public void someTest() {
        /*
         * do your thing and when  
         * FacesContext.getCurrentInstance().getViewRoot().getViewMap(); 
         * is called, this.viewMap is returned.
         */
    }
}

Algunas lecturas:

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top