Тестирование многопоточного кода с помощью JUnit - странное поведение - PullRequest
1 голос
/ 06 августа 2011

Я новичок в параллелизме в Java. Я использовал Junit для тестирования некоторых моих кодов, но результат странный. Приведенный ниже фрагмент кода ничего не записывает в консоль, когда я запускаю его с помощью JUnit (Eclipse), хотя он успешно выполняется.

@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();
}

Однако, если я запускаю с методом main, он работает:

// 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 существует цепочка операций ввода-вывода для получения имени словаря из файла.

Есть ли вероятность, что выполнение кода ввода-вывода с использованием многопоточности не работает с 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?

С уважением.

Ответы [ 2 ]

2 голосов
/ 07 августа 2011

JUnit печально известен тем, что неправильно работает с потоками.

Мне удалось заставить их работать только с помощью TestNG.Я бы порекомендовал переключатель.Это должно означать немного больше, чем другой @Test импорт аннотаций и новый JAR-файл в CLASSPATH.

2 голосов
/ 06 августа 2011

Ваш тестовый метод должен блокировать выполнение до тех пор, пока не будут завершены потоки.

Рассмотрите возможность использования ThreadPool. См. ExecutorService.awaitTemination , чтобы узнать больше ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...