2012-09-14 13 views
6
public class TestStatic { 
    public static int methodstatic(){ 
     return 3; 
    } 
} 


@Test 
@PrepareForTest({TestStatic.class}) 
public class TestStaticTest extends PowerMockTestCase { 

    public void testMethodstatic() throws Exception { 
     PowerMockito.mock(TestStatic.class); 
     Mockito.when(TestStatic.methodstatic()).thenReturn(5); 
     PowerMockito.verifyStatic(); 
     assertThat("dff",TestStatic.methodstatic()==5); 
    } 

    @ObjectFactory 
    public IObjectFactory getObjectFactory() { 
     return new org.powermock.modules.testng.PowerMockObjectFactory(); 
    } 
} 

Die Ausnahme:PowerMock statische Klasse nicht spotten nicht

org.mockito.exceptions.misusing.MissingMethodInvocationException: 
when() requires an argument which has to be 'a method call on a mock'. 
For example: 
    when(mock.getArticles()).thenReturn(articles); 

Also, this error might show up because: 
1. you stub either of: final/private/equals()/hashCode() methods. 
Those methods *cannot* be stubbed/verified. 
2. inside when() you don't call method on mock but on some other object. 

ich es durch Intellij leite, die Legacy-Code viele Methoden hat ...

Jemand hat und die Idee, ich ging über die offiziellen tuto, kein Mittelwert diesen einfachen Test an dieser Antwort

Antwort

0

Werfen Sie einen Blick Arbeits machen: Mocking Logger and LoggerFactory with PowerMock and Mockito

Sie sollten auch nicht Mockito.when verwenden, wenn Sie statische Anrufe stummschalten möchten, aber PowerMockito.when.

Statiken sind ein Testbarkeits-Albtraum, Sie vermeiden so viel wie möglich und überarbeiten Ihr Design, um keine Statik mehr zu verwenden oder um PowerMock-Tricks zu verwenden, um Ihren Produktionscode testen zu können.

Hoffe, dass hilft.

Cheers, Brice

+0

Danke, yeah, Sie wählen nicht den Legacy-Code :), aber Sie können refaktorieren ... machen Sie statische Mock und wenden Sie mockable Muster an. – Sam

+0

Vereinbarter Legacy-Code ist ein Schmerz, PowerMock ist in der Tat in diesen Fällen mächtig :) – Brice

+1

Das ist einfach nicht wahr: "Sie sollten' Mockito.when' auch nicht verwenden, wenn Sie statische Aufrufe stummschalten wollen ". Die PowerMockito-Verwendungsseite verwendet 'Mockito.when' in ihrem Beispielcode. – ach

3

nahm ich einen Blick auf meine Tests von Legacy-Code und ich kann, ist sehen, dass Sie PowerMockito.mock(TestStatic.class) statt PowerMockito.mockStatic(TestStatic.class) nennen. Es spielt keine Rolle, ob Sie PowerMockito.when(...) oder Mockito.when(...) verwenden, weil die erste einfach an die zweite delegiert.

Noch eine Bemerkung: Ich verstehe, dass Sie vielleicht einen Legacy-Code testen müssen. Vielleicht könnten Sie das im JUnit4-Stil tun, nur um keine Legacy-Tests zu erstellen? Das von Brice erwähnte Beispiel ist ein gutes Beispiel.

5

ich die Lösung für ein solches Problem in meinem Fall gefunden, möchte es mit Ihnen teilen:

Wenn ich die verspottet Methode in der Testklasse genannt:

@RunWith(PowerMockRunner.class) 
@PrepareForTest(Calendar.class) 
public class TestClass { 
    @Test 
    public void testGetDefaultDeploymentTime() 
    PowerMockito.mockStatic(Calendar.class); 
    Calendar calendar = new GregorianCalendar(); 
    calendar.set(Calendar.HOUR_OF_DAY, 8); 
    calendar.set(Calendar.MINUTE, 0); 
    when(Calendar.getInstance()).thenReturn(calendar); 
    Calendar.getInstance(); 
    } 
} 

es funktionierte gut. Aber als ich den Test so umschrieb, dass er Calendar.getInstance() in einer anderen Klasse aufruft, verwendete er die echte Kalendermethode. So

@Test 
public void testGetDefaultDeploymentTime() throws Exception { 
    mockUserBehaviour(); 
    new AnotherClass().anotherClassMethodCall(); // Calendar.getInstance is called here 
} 

, als eine Lösung habe ich AnotherClass.class zu @PrepareForTest und es funktioniert jetzt.

Es scheint, dass PowerMock wissen muss, wo verspottet statische Methode aufgerufen wird.

+0

Dies scheint nicht wie eine statische Methode Aufrufe, Sie rufen die Methoden auf dem Objekt, soweit ich sehen kann !!! –