Ну во первых написание в несколько раз большего кода не является проблемой. Ибо есть правило: «написание кода не является узким местом разработки». Узкое место это например постоянный реинжениринг дизайна. Тестов и должно быть больше, чем оснвоного кода, но код тестов должен быть простым, и легко пишушимся. Что-то подали на вход, что-то получили на выходе.
Что касается сложных тестов, то проблема в дизайне кода. Что бы правильно задизайнить нужны не малые скилы. Я тоже постоянно натыкаюсь на такие проблемы. Но со временем понимаю, что многие вещи, которые раньше казались нетестируемыми, теперь уже ясно как переписать, что бы легко протестировать. Главное мотивация. Кто хочет — ищет возможности. Кто не хочет — ищет причины.
И последнее, всегда есть вещи которые практически нельзя протестировать, например многопоточность. Это нормально. Просто такой код должен быть локализован.