2013-01-07 64 views
0

我想創建單元測試來測試包含另一個對象的類。我爲這個第二個對象創建了一個模擬。依賴驗證函數調用mockito

當我測試我的第一類的方法時,我想驗證是否調用第二個對象的函數。爲此,我使用函數verify(mock).myfunction();

我的問題是,我的對象2的相同功能可以通過我的第一類的幾個函數調用。

當我編寫測試類時,我通過函數編寫了一個測試函數,但似乎在測試方法開始時「時間」沒有被重置。

我不知道我是否清楚,因此,一個例子:

public class Main { 
    public Object o = createObject(); 

    public void function1(){ 
     o.function(); 
    } 

    public void function2(){ 
     o.function(); 
    } 


    public Object createObject() { 
     return new Object() ; 
    } 


public class MainTest { 
    private static Main main; 

    @BeforeClass 
    public static void setUp() throws Exception { 
     final Object mockO = mock(Object.class); 

     main = new Main() { 
      @Override 
      public Object createObject() { 
       return mockO; 
      } 
      }; 
    } 

    @Test 
    public void testfunction1(){ 
     verify(main.world[0], never()).function(); 
     main.function1(); 
     verify(main.world[0]).function(); 
    } 

    @Test 
    public void testfunction2(){ 
     verify(main.world[0], never()).function(); 
     main.function2(); 
     verify(main.world[0]).function(); 
    } 

如果我測試testfunction1()testfunction2()忽略不計,它的工作。

如果我測試testfunction2()testfunction1()忽略,它的工作。

但如果兩項測試分別是執行,我有一個錯誤:

org.mockito.exceptions.verification.NeverWantedButInvoked: 
Object.function(); 
Never wanted here : 
-> at test.MainTest.testfunction1 
but invoked here : 
at source.Main.function2 

我怎麼能單獨測試兩種功能?

+1

你的'setUp()'方法是'static' ...爲什麼? –

+0

我有一個錯誤,如果我刪除靜態「java.lang.Exception:方法setUp()應該是靜態的」 – helene

+0

嗯,你會考慮切換到TestNG? :p當這個錯誤消息經常被報告爲組件x和y中的一個錯誤時,它會被Google搜索到...... TestNG從來沒有遇到過這樣的問題。 – fge

回答

2

重命名setUp()方法成別的東西,使之成爲非靜態方法,並使其@Before而不是@BeforeClass

private Main main; 

@Before 
public void initMain() 
{ 
    // what you already do 
} 

@BeforeClass方法類中的所有測試之前運行一次,而@Before方法在前各運行一次測試。

+0

我已經一法 「@Before」 「@Before \t公共無效的init()拋出的AWTException { \t \t main.init(); \t} 」 我已經嘗試刪除 「靜態」 的,但我有一個錯誤「java.lang.Exception:方法setUp()應該是靜態的 – helene

+0

你可以重命名你的'setUp()'方法到別的東西,就像在我的例子中嗎?我習慣於TestNG,它沒有方法命名方面的限制... – fge

+0

JUnit 4沒有方法命名的限制... –