Если вы используете модульные тесты для тестирования многопоточного кода, вы, вероятно, делаете это неправильно.
Для начала, у вас нет никаких гарантий, что оба метода будут работать одновременно; это означает, что ваши тесты не гарантируют работоспособность вашего кода.
Возможно, вы могли бы проверить, нормально ли работает ваш метод в многопоточной среде, вставив спящие команды, но это слишком навязчиво для модульных тестов; на самом деле это подтверждение концепции, а не то, что я бы оставил в качестве модульного теста после того, как уверен, что некоторая часть кода работает как задумано.
Многопоточные тесты сами по себе подходят для ускорения модульного тестирования, когда модульные тесты занимают много времени, но модульное тестирование необходимо для тестирования небольших изолированных методов.
То, что вы могли бы рассмотреть, - это стресс-тестирование, но оно выполняется «снаружи», а не «изнутри», как модульные тесты. Это означает, что вы снова пишете клиент на своем сервере и запускаете его тысячи раз с нескольких компьютеров, тестируя всю систему вместо одного изолированного метода. У стресс-тестирования есть два основных преимущества. Во-первых, стресс-тестирование используется для точного определения типа дефекта, который возникает раз в сто прогонов в режиме реального времени, и, во-вторых, поскольку они сделаны «извне», они лучше воспроизводят способ, которым потоки будут проходить через ваш применение.
Модульные тесты в моем мнении такие же плохие для тестирования многопоточного кода, как и запуск вашего кода через отладчик - пока один поток ожидает, когда вы инициируете следующий шаг, другой поток истечет, и у вас никогда не будет реального репо.
Подводя итог, не все должны быть проверены модулем; Проверочные тесты - хороший способ убедиться, что ваша многопоточная коллекция действительно поточно-ориентирована, а стресс-тестирование отлично подходит для обнаружения ошибок в многопоточном коде.