2012-06-27 33 views
10

Obtengo una NullPointerException cuando intento probar algunos métodos en un objeto JDialog. Tengo para inicializar una versión simulada del padre del diálogo, así como otra clase que se utilizará (además de llamar a un método estático El código es el siguiente:.Powermock, Mockito nullpointerexception al llamar a super() JDialog

@RunWith(PowerMockRunner.class) 
@PrepareForTest(ControlFileUtilities.class) 
public class StructCompDlgTest 
{ 
    @Before 
    public void setUp() throws Exception 
    { 
    controlFrame = org.mockito.Mockito.mock(ControlFrame.class); 
    structCmpDlg = new StructureCompareDialog(controlFrame); 
    serverPipeline = org.mockito.Mockito.mock(ServerPipeline.class); 
    } 
... 
} 

El código que se pidió la construcción del diálogo está aquí:

StructureCompareDialog(IControlFrame controlFrame) 
{ 
super((Frame) controlFrame, "title", true); 
... 
} 

cuando el super constructor se llama puede que lo consiga un NullPointerError en java.awt.Window.addOwnerWindow (Window.java:2525)"

void addOwnedWindow(WeakReference weakWindow) { 
    if (weakWindow != null) { 
    synchronized(ownedWindowList) { ***<<------ offending line*** 
     // this if statement should really be an assert, but we don't 
     // have asserts... 
     if (!ownedWindowList.contains(weakWindow)) { 
     ownedWindowList.addElement(weakWindow); 
     } 
    } 
    } 
} 

Sé que estoy mezclando statics y swing GUI en un remolino tóxico, pero no tengo otra opción. Me dieron la instrucción de juntar algunas pruebas unitarias con el código existente. No tengo idea de qué está pasando mal.

Gracias

+0

¿Alguna vez este trabajo? Si es así, ¿te importaría publicar la solución? – glenneroo

+0

Starnge está obteniendo un puntero nulo en 'synchronized (ownedWindowList)'. Si marca el miembro de datos 'ownedWindowList' en Window.java, se ha instanciado y nunca se ha asignado a null nuevamente. preguntándose qué podría hacer que este miembro de datos sea nulo. Puede verificar su código si se accede a este miembro de datos (utilizando Reflection) y se lo ha cambiado a nulo.En el mínimo caso posible, este miembro de datos debe cambiarse manualmente, pero es mejor asegurarse. –

+0

@glenneroo, creo que poner recompensa aquí en lugar de crear una nueva pregunta con tu propio código fue un error. ¿Podría proporcionar algunos detalles, como lo que hace y acumular el rastro de excepción (s) que obtiene. – SergGr

Respuesta

5

Parece complicado! Esencialmente usted va a tener que encontrar todos los métodos que están siendo llamados en controlFrame como parte del constructor, y luego espolvorear algunas llamadas a

when(controlFrame.methodCalled()).thenReturn(somethingSensible); 

Si este es el aspecto de una tarea difícil, ¿qué hay de tratar para crear una implementación predeterminada de IControlFrame que cree como parte de su prueba setUp() y usar esa instea de un simulacro.

Tuve un problema similar hace un tiempo en el que estaba intentando probar la unidad de un oyente JMS de primavera. Correcta o incorrectamente, obtuve una solución de trabajo creando mi propia implementación predeterminada de DefaultMessageListenerContainer que me daba problemas similares a los que está describiendo. Mi solución implicó extender la aplicación real con mi propia versión específica de prueba que se veía así

/** 
* Empty mocked class to allow unit testing with spring references to a 
* DefaultMessageListenerContainer. The functionality on this class should never be 
* called so just override and do nothing. 
*/ 
public class MockDefaultMessageListenerContainer extends DefaultMessageListenerContainer { 

    public MockDefaultMessageListenerContainer() { 
    } 

    public void afterPropertiesSet() { 
    } 

    @Override 
    protected Connection createConnection() throws JMSException { 
     return null; 
    } 
} 

En mi ejemplo, yo era capaz de conseguir mis pruebas de funcionamiento mediante el paso posterior un valor null para el método CreateConnection problemmatic(). Tal vez el mismo enfoque puede ayudarte.

0

El ownedWIndowList es transient en la clase java.awt.Window. ¿Se está serializando su instancia del JDialog? Si es así, puede que tenga que utilizar el método readObject(java.io.ObjectStream) desde la interfaz Serializable para volver a inicializar el ownedWIndowList

0

no sé lo que su IControlFrame parece, pero pasando una burlado Frame a super() no funciona. Tenía que crear instancias de mi propia versión:

private class EmptyControlFrame extends JFrame implements IControlFrame { 

    @Override 
    public JFrame getFrame() { 
     return null; 
    } 

    // return null for any other overrides from IControlFrame 
} 

Luego, en su configuración():

controlFrame = new EmptyControlFrame(); 
Cuestiones relacionadas