2013-08-05 4 views
6

Jedną z metod statycznych używam, robi dwie rzeczy. Zwraca niektóre dane, ale także modyfikuje obiekt argumentu, który jest do niego przekazywany. Ten zaktualizowany obiekt argumentu jest następnie używany w kodzie.doładowanie dla metod statycznych - PowerMock

Używam PowerMock do kpiny z zachowania zwrotnego.

Definiując drugą część - aktualizując argument wejściowy, definiuję metodę doAnswer, ale nie działa. Metoda, którą próbuję przetestować, wygląda tak.

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))); 
}  

ale powyżej wyskakuje komunikat o błędzie "Wykryto tu niedokończony stubb". Connector to klasa stron trzecich, więc nie mam kontroli nad jej zachowaniem.

Wszelkie sugestie, co może być nie tak?

Odpowiedz

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

Twój problem to when. W normalnym Mockito, przy użyciu dowolnego doAnswer/doReturn/etc połączenia, trzeba nawiązać połączenie jesteś stubbing poza zaproszenia do when, tak:

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

PowerMockito wymaga ponadto, że wezwania do metod statycznych in the next statement zdarzyć, tak jak poniżej:

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

Należy pamiętać, że documentation I linked jest faktycznie niezgodne - wygląda docs nawiązują do zera-arg when, natomiast klasa dosłowny jest wymagane w skutku podpisów zdolny. To może być dobre oznaczenie jako błąd, jeśli masz chwilę.

Obowiązkowe PSA: Ogólnie dobrym pomysłem jest avoid mocking types you don't own, chociaż jury's still out on that one.

+0

thnx dla linku do dokumentu. Spróbuję jutro. – RandomQuestion

+0

To działało. Złożyłem błąd. Temat nie wskazuje, ale nie mogę go edytować. https://code.google.com/p/powermock/issues/detail?id=452&can=4&q=javadoc – RandomQuestion