2011-09-26 47 views
0

我試圖用Power Mock來模擬某些場景。電源模擬 - 嘲諷終極課堂時的斷言錯誤

我在下面的測試方法得到斷言錯誤 - returnSevenTest()

類被測試

package tutorial.one; 

    public class TutorialOne { 

    //fields 

    private int number; 

    private String name; 

    private final DependentFinalClass finalObj; 


    public TutorialOne (DependentFinalClass dep) { 
     this.finalObj= dep ; 
    } 

    public TutorialOne(int number, String name) { 
     super(); 
     this.number = number; 
     this.name = name; 
     finalObj = new DependentFinalClass(); 
    } 

    public static int returnTwo() 
    {  
    return 2; 
    } 

    public int returnThree() 
    { 
     return (returnTwo()+1); 
    } 


    public final int returnFour() 
    { 
     return (returnThree()+1); 
    } 

    private final int returnFive(int addOne) 
    { 
     return (returnFour()+addOne); 
    } 

    public int returnSix(int addOne) 
    { 
     return (returnFive(1)+addOne); 
    } 

    public int returnSeven() 
    { 
     final int addValue= finalObj.callMeToAddOne(true); 
     return (returnSix(1)+ addValue); 
    } 
} 

final類

使用Power模擬+易模擬
package tutorial.one; 

public final class DependentFinalClass { 

    final int callMeToAddOne(Boolean need) 
    { 
     if(need.equals(true)) 
      return 1; 
    else 
      return 1; 
    } 
} 

測試執行類

package tutorial.one; 

import stmts .... 


@RunWith(PowerMockRunner.class) 

//We prepare the IdGenerator for test because the static method is normally not 
//mockable 
@PrepareForTest({TutorialOne.class, DependentFinalClass.class}) public class TutorialOneTests { 

    @Test 
    public void returnSevenTest() throws Exception 
    { 
     int expected=7; 
     TutorialOne privateTest =createPartialMock(TutorialOne.class,"returnFive"); 

     DependentFinalClass finalDependentTest = createPartialMock(DependentFinalClass.class,"callMeToAddOne"); 
     expect(finalDependentTest.callMeToAddOne(true)).andReturn(1); 


     expectNew(TutorialOne.class, finalDependentTest).andReturn(privateTest); 
     expectPrivate(privateTest, "returnFive", 1).andReturn(5); 


     replayAll(TutorialOne.class,finalDependentTest,privateTest); 
     int actual = privateTest.returnSeven(); 
     verifyAll(); 
     assertEquals("Expected and actual did not match", expected, actual); 
     resetAll(); 
    } 

}

收到錯誤:

java.lang.AssertionError: Expectation failure on verify: tutorial.one.TutorialOne([email protected]e6): expected: 1, actual: 0 at org.powermock.api.easymock.internal.invocationcontrol.NewInvocationControlAssertionError.throwAssertionErrorForNewSubstitutionFailure(NewInvocationControlAssertionError.java:20) at org.powermock.api.easymock.PowerMock.verifyClass(PowerMock.java:2279) at org.powermock.api.easymock.PowerMock.verify(PowerMock.java:1646) at org.powermock.api.easymock.PowerMock.verifyAll(PowerMock.java:1586) at tutorial.one.TutorialOneTests.returnSevenTest(TutorialOneTests.java:174) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source)

任何幫助十分讚賞!謝謝

回答

0

我認爲問題在於你已經聲明瞭期望值: expectNew(TutorialOne.class,finalDependentTest).andReturn(privateTest); 但在你的方法調用它沒有被調用,嘗試在返回後添加anyTimes(): expectNew(TutorialOne.class,finalDependentTest).andReturn(privateTest).anyTimes(); 或刪除此期望,因爲您不使用構造函數測試您只使用部分模擬實例。