2013-08-05 8 views
6

Один из статических методов, которые я использую, выполняет две вещи. Он возвращает некоторые данные, но также изменяет передаваемый ему объект аргумента. Этот обновленный объект аргумента затем используется позже в коде.doAnswer для статических методов - PowerMock

Я использую PowerMock, чтобы высмеять поведение возврата.

Для определения второй части - обновления входного аргумента, я определяю метод doAnswer, но он не работает. Метод, который я пытаюсь проверить, выглядит так.

public void login() throws ConnectionException, AsyncApiException { 
    ConnectorConfig partnerConfig = new ConnectorConfig(); 

    //This call sets the value in one member variable 'serviceEndPoint in ParterConfig which is accessed later in this method only. 
    partnerConnection = Connector.newConnection(partnerConfig); 

    //partnerConfig.getServiceEndpoint is called. 

    PowerMockito.mockStatic(Connector.class); 
    when(Connector.newConnection(Mockito.any(ConnectorConfig.class))).thenReturn(partnerConnection); 

    PowerMockito.doAnswer(new Answer<Void>() { 
     @Override 
     public Void answer(InvocationOnMock invocation) { 
      ConnectorConfig config = (ConnectorConfig) invocation.getArguments()[0]; 
      config.setServiceEndpoint("service end point"); 
      return null; 
     } 
    }).when(Connector.newConnection(Mockito.any(ConnectorConfig.class))); 
}  

, но выше бросает ошибку, говоря «Обнаружен незавершенный обжиг здесь». Connector является сторонним классом, поэтому я не контролирую его поведение.

Любые предложения, что может быть не так?

ответ

11
PowerMockito.doAnswer(new Answer<Void>() { 
    /* ... */ 
}).when(Connector.newConnection(Mockito.any(ConnectorConfig.class))); 

Ошибка when. В нормальном Mockito, используя любой doAnswer/doReturn/и т.д. вызов, вы должны поместить вызов вы гася вне вызова к when, например, так:

Mockito.doAnswer(new Answer<Void>() { 
    /* ... */ 
}).when(yourMock).callVoidMethod(); 
//   ^^^^^^ 

PowerMockito также требует, что вызовы статических методов случается in the next statement, например, так:

PowerMockito.doAnswer(new Answer<Void>() { 
    /* ... */ 
}).when(Connector.class); Connector.newConnection(/*...*/); 
//     ^^^^^^ 

Обратите внимание, что на самом деле documentation I linked непоследовательно - похоже, что документы намекают на нулевой агд when, в то время как класс буквальный требуются в подписи безрезультатно возможность. Возможно, неплохо было бы отметить как ошибку, если у вас есть момент.

обязательное PSA: Это вообще хорошая идея avoid mocking types you don't own, хотя jury's still out on that one.

+0

thnx для ссылки на документ. Я дам ему попробовать завтра. – RandomQuestion

+0

Это сработало. Я подал ошибку. Тема не должна указывать, но я не могу ее отредактировать. https://code.google.com/p/powermock/issues/detail?id=452&can=4&q=javadoc – RandomQuestion

Смежные вопросы