2015-12-02 129 views
0

我使用Mockito編寫一個簡單的單元測試。我有一個smiple 抽象類,它實現Runnable的Mockito:驗證所捕獲的對象的方法被調用

public abstract class MyRunnable implements Runnable { 
    @Override 
    public void run() { 
    doTask(); 
    } 
    public abstract void doTask(); 
} 

然後,在測試中的功能使用MyRunnable

public class MyService { 
    public void something() { 
    executor.execute(new MyRunnable() { 
     @Override 
     doTask() { 
      … 
     } 
    }); 
    } 
} 

我的測試情況下,我想測試doTask()已運行:

@Test 
public void testSomething() { 
    … 
    ArgumentCaptor<MyRunnable> myCaptor = ArgumentCaptor.forClass(MyRunnable.class); 
    verify(mockMyService).something(myCaptor.capture()); 

    // get what has been captured 
    MyRunnable myRunnable = myCaptor.getValue(); 
    //verify doTask() has run , but got ERROR. 
    verify(myRunnable).doTask(); 
} 

我測試的情況下拋出以下錯誤:

org.mockito.exceptions.misusing.NotAMockException: 
Argument passed to verify() is of type and is not a mock! 

錯誤提示verify()只接受嘲笑對象。然後,我怎麼能確認/測試的捕獲MyRunnable對象已運行doTask()用的Mockito?

回答

1

如果你有超過你的代碼的控制,你可以讓你的代碼可測試用的Mockito工廠類是這樣的...

public class MyService { 

    private MyRunnableFactory = factory; 

    public MyService(MyRunnableFactory factory) { 
    this.factory = factory; 
    } 

    public void something() { 
    executor.execute(factory.createInstance()); 
    } 
} 

然後你的測試可以簡單地注入工廠的模擬,你可以verify其行爲/互動

@Mock MyRunnableFactory factory; 
@Mock MyRunnable myRunnable; 

@Test 
public void testSomething() { 

    when(factory.createInstance()).thenReturn(myRunnable); 

    // method under test 
    MyService service = new MyService(); 
    service.something(); 

    verify(myRunnable).doTask(); 
} 

我用經驗法則的類創建的對象,不應該有任何的業務邏輯,所以你沒有這些測試頭痛。這在本質上是Single Responsibilty Principal

+0

謝謝,這也是我的想法太:) – user842225

0

因爲MyRunnable由代碼測試創建你不能做的Mockito此。但是你可以看看PowerMock,因爲它可以讓你嘲笑的構造器:通過移動使用new關鍵字到一個單獨的任何代碼https://github.com/jayway/powermock/wiki/MockConstructor

+0

有沒有一種方法來捕捉嘲笑MyRunnable,而不是真實的嗎? – user842225

+0

如果注入MyRunnable的實例爲爲MyService,你傳遞一個嘲笑的對象,你應該能夠做到這一點 – Jorgeejgonzalez

相關問題