2012-06-27 2 views
10

Я получаю исключение NullPointerException, когда пытаюсь выполнить тестирование некоторых методов в объекте JDialog. Я должен инициализировать макет версию родительского диалога, а также другой класс, который будет использоваться (в дополнении к вызову статического метода Код выглядит следующим образом:.Powermock, Mockito nullpointerexception при вызове 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); 
    } 
... 
} 

Код, который вызывается для построения диалога здесь:

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

когда супер конструктор вызывается я в конечном итоге получить NullPointerError на 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); 
     } 
    } 
    } 
} 

Я знаю, что смешиваю статику и свинг-ги в ядовитом вихре, но у меня нет выбора. Мне была дана инструкция, чтобы собрать некоторые модульные тесты с существующим кодом. Я понятия не имею, что происходит не так.

Thanks

+0

ли вы когда-нибудь получить эту работу? Если да, не возражаете ли вы опубликовать решение? – glenneroo

+0

Starnge, вы получаете нулевой указатель на 'synchronized (ownedWindowList)'. Если вы проверили член данных 'ownedWindowList' в Window.java, он был создан и никогда не был назначен null. Подумайте, что может сделать этот элемент данных пустым. Можете ли вы проверить свой код, если этот элемент данных доступен (с использованием Reflection) и был изменен на null.Его наименее возможным случаем является то, что этот элемент данных необходимо изменить вручную, но лучше убедиться. –

+0

@glenneroo, я думаю, что создание баунти здесь вместо того, чтобы создавать новый вопрос с вашим собственным кодом, было ошибкой. Не могли бы вы предоставить некоторые детали, такие как то, что вы делаете, и трассировать трассировку исключений (ов), которые вы получаете. – SergGr

ответ

5

Выглядит сложно! По сути, вы будете иметь, чтобы найти все методы, которые в настоящее время называются по controlFrame как часть конструктора, а затем посыпать несколько звонков

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

Если это выглядит как сложной рутинной работы, как о попытке чтобы создать стандартную реализацию IControlFrame, которую вы создаете как часть вашего тестового setUp(), и используя эту интуицию макета.

У меня была аналогичная проблема некоторое время назад, когда я пытался провести тестирование весеннего слушателя JMS. Правильно или неправильно, я получил рабочее решение, создав свою собственную стандартную реализацию DefaultMessageListenerContainer, которая давала мне похожие проблемы тому, что вы описываете. Мое решение участвует расширение реального осуществления с моей собственной тестовой конкретной версией, которая выглядела как этот

/** 
* 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; 
    } 
} 

В моем примере я был в состоянии получить мои тесты работы, передавая обратно значение null для метода problemmatic CreateConnection(). Возможно, такой же подход может помочь вам.

0

ownedWIndowList является transient в классе java.awt.Window. Является ли ваш экземпляр JDialog сериализованным? Если да, то вам, возможно, придется использовать метод readObject(java.io.ObjectStream) из сериализуемого интерфейса повторно инициализировать ownedWIndowList

0

Я не знаю, что ваш IControlFrame выглядит, но пропускание издевались Frame в супер() не работает. Я должен был создать экземпляр свою собственную версию:

private class EmptyControlFrame extends JFrame implements IControlFrame { 

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

    // return null for any other overrides from IControlFrame 
} 

Тогда в настройках():

controlFrame = new EmptyControlFrame();