2015-02-10 70 views
0

我有以下類:如何測試異步線程方法被調用?

public class ForTest { 
    public void methodToTest(Thread thread){ 
     thread.start(); 
    } 
} 
class MyThread extends Thread{ 
    FooClass fooClass; 
    public MyThread(FooClass fooClass){ 
     this.fooClass = fooClass; 
    } 
    @Override 
    public void run() { 
     fooClass.bar(); 
    } 
} 
class FooClass{ 
    public void bar(){} 
} 

我想測試方法methodToTest
我想通過MyThread的實例作爲提到的方法的參數。

因此我想驗證方法bar被調用。

你能幫我用Mockito或Powermock寫嗎?

回答

0

夫婦的事情要考慮:

  1. 由於您使用的外螺紋,一些kindof等待/阻塞是必要
  2. 如果線程代碼更加複雜,並且由於我們需要等待線程完成一般來說的執行(而不是您的情況),則需要使用超時功能。
  3. 您不必一定要使用模擬,例如, FooClass.bar()方法可以設置/修改一個字段,然後檢查一個更改的值。

    @Test 
    public void testSomeMethod() throws InterruptedException { 
        FooClass fooClassMock = Mockito.mock(FooClass.class); 
        Thread thread = new MyThread(fooClassMock); 
    
        new ForTest().methodToTest(thread); 
    
        thread.join(); 
    
        Mockito.verify(fooClassMock).bar(); 
    } 
    
+0

我認爲我不應該使用超時。 – gstackoverflow 2015-02-10 14:11:07

+0

嗯,這取決於。在你的情況下,因爲它是一個微不足道的代碼,所以你不必使用'timeout'參數,因爲線程執行速度非常快。 – Crazyjavahacking 2015-02-10 14:17:46

+0

但通常如果線程執行可能更長更復雜,應始終使用@Test(timeout ...)。 – Crazyjavahacking 2015-02-10 14:18:17