2011-08-06 51 views
1

我是新來的Java併發性。我用Junit來測試我的一些代碼,但結果很奇怪。當我使用JUnit(Eclipse)運行它時,雖然它成功執行,但下面的代碼片段沒有向控制檯寫入任何內容。用JUnit測試多線程代碼 - 奇怪的行爲

@Test 
public void testGetNameWithMultithreading() { 

    // code to create IndexFile and DictionaryFile... 
    ... 
    Thread taskOne = new GetNameTask(packOneIndex, packOneDict); 
    Thread taskTwo = new GetNameTask(packTwoIndex, packTwoDict); 
    taskOne.start(); 
    taskTwo.start(); 
} 

但是,如果我與主要方法運行,它的工作原理:

// Switch to test with good-old main method. 
public static void main(String args[]) { 

     // code to create IndexFile and DictionaryFile... 
     ... 
     Thread taskOne = new GetNameTask(packOneIndex, packOneDict); 
     Thread taskTwo = new GetNameTask(packTwoIndex, packTwoDict); 
     taskOne.start(); 
     taskTwo.start(); 
} 

這是任務:

public class GetNameTask extends Thread { 

    public GetNameTask (IndexFile indexFile, DictionaryFile dictFile) { 
     this.dictFile = dictFile; 
     this.indexFile = indexFile; 
    } 

    @Override 
    public void run() { 
     Dictionary dictionary = new DICTDictionary(indexFile, dictFile); 
     System.out.println(dictionary.getName()); 
    } 

    private final IndexFile indexFile; 
    private final DictionaryFile dictFile; 
} 

當構建DICTDictionary,有IO鏈操作從文件中獲取字典的名稱。

通過使用多線程運行IO代碼的任何機會都不適用於JUnit?

編輯:我發現如何使它工作。因爲JUnit在單線程上執行測試,所以我必須將我的2個小線程加入JUnit線程才能獲得預期的結果。所以,這是有效的。

@Test 
public void testGetNameWithMultithreading() { 

    // code to create IndexFile and DictionaryFile... 
    ... 
    Thread taskOne = new GetNameTask(packOneIndex, packOneDict); 
    Thread taskTwo = new GetNameTask(packTwoIndex, packTwoDict); 
    taskOne.start(); 
    taskTwo.start(); 
    try { 
     taskOne.join(); 
     taskTwo.join(); 
    } catch (InteruptedException ie) { 
     ie.printStackTrace(); 
    } 
} 

有沒有更簡單的方法來用JUnit測試多重代碼?

此致敬禮。

+0

您可能感興趣的:http://stackoverflow.com/questions/12159/how-should-i-unit-test-threaded-code – Grundlefleck

回答

2

JUnit因無法正確處理線程而臭名昭着。

我只能使他們使用TestNG工作。我會推薦一個開關。它應該僅僅意味着在CLASSPATH中引入不同的@Test批註導入和新的JAR。

+2

是的,你需要用TestNG做的所有事情就是以正常的方式編寫你的測試,然後告訴TestNG在testng.xml中的線程中運行它們。您還可以使用@Test(threadPoolSize = 10,invocationCount = 10000)在線程中運行單個方法。 http://testng.org –

+1

Cedric Beust是TestNG的創造者,對於那些不知道的人。好東西。 – duffymo