2011-08-06 53 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