2012-04-04 7 views
3

Ich habe gerade angefangen, mit PowerMock und EasyMock zu spielen, und ich bin ein wenig verwirrt über die Art, wie verspottete Methodenaufrufe gezählt werden.Method Invocation Count Assertion

Beispielcode:

class ClassToBeTested{ 
private boolean toBeMocked(Integer i){ 
    return i%2==1; 
    } 
} 

Und der Testcode:

@RunWith(PowerMockRunner.class) 
@PrepareForTest(ClassToBeTested.class) 
public class ClassToBeTestedTest{ 

private final Integer i=2; 
ClassToBeTested underTest; 

@Before 
public void setUp() throws Exception { 
    underTest=PowerMock.createPartialMock(ClassToBeTested.class, 
        "toBeMocked"); 
    PowerMock.expectPrivate(underTest, "toBeMocked", i) 
      .andReturn(true); 
    PowerMock.replay(underTest); 
} 
@Test 
public dummyTest(){ 
    Assert.assertTrue(underTest.toBeMocked(i); 
    //the call is: underTest.toBeMocked(2) 
    //so the computation is return 2%2==1; google says it 0 :) 
    //thus real method would return 0==1 (false) 
    //mocked one will return true, assertion should pass, that's ok 
    //RERUN ASSERTION 
    Assert.assertTrue(underTest.toBeMocked(i); 
    //method invocation count should be now 2 
} 

    @After 
    public void tearDown() { 
    PowerMock.verify(underTest); 
    //WILL FAIL with exception saying 
    //the mocked method has not been called at all 
    //expected value (obvious) is one 
} 

Und meine Frage ist, warum die verspottete Methodenaufruf Erwartung scheitern? Warum zeigt die Überprüfung ClassUnderTest, dass die verspottete Methode überhaupt nicht aufgerufen wurde?

Antwort

1

Es funktioniert für mich, nachdem die Linie erwarten Wechsel zu:

PowerMock.expectPrivate(underTest, "toBeMocked", i).andReturn(true).times(2); 

Auch ohne diese Änderung, es nicht sagen, die verspottet Mutter nicht genannt wurde. Es sagt

Unexpected method call toBeMocked(2): 
    toBeMocked(2): expected: 1, actual: 2 

Verwenden Sie die aktuellsten PowerMock und EasyMock-Versionen?

+0

** Meine Schuld ** Das Beispiel, das ich oben vorgestellt habe, wurde auf das eigentliche Problem gemacht, aber leider habe ich ** ein wichtiges Problem übersehen, das mein Problem erklärt: – wilu

+0

** Meine Schuld ** Das Beispiel I Das obige Problem wurde auf der Basis des eigentlichen Problems gemacht, aber leider habe ich ein wichtiges Problem übersehen, das mein Problem erklärt: mein Test dummyMethode im realen Beispiel ist in zwei Test-Methoden unterteilt, die dieselbe verspottete Methode ausführen. Meine Erwartungen sind, dass die verspottete Methode nur einmal von allen Testmethoden ausgeführt wird. Ich dachte ** falsch ** als After Methode wird ** einmal ** nach der Ausführung aller Testmethoden aufgerufen werden. Eine Testmethode nennt die verspottete Methode überhaupt nicht, daher ist der tatsächliche Aufruf O, erwartete 1, also meine Frage ... – wilu