Statický typový systém nemá s testováním nic společného. Historicky vznikl kvůli tomu, aby kompilátor mohl generovat rychlý kompaktní kód. Na návrh programu má poněkud komplikační dopad - návrh musí být podřízen statickému typování, ale bez něj by byl jednodušší.
Unit testy píšu kvůli testování funkčnosti, ne kvůli ověřování typů. Pokud budu mít kupř. za úkol napsat nějaký grafový algoritmus, tak unit testem zkouším, zda funguje tak jak má, a ne jestli tam jdou "správné" typy. Statická typová kontrola, jak se zdá, v někom vzbuzuje falešný pocit, že je to nějaký test navíc. Ale to není! Statická typová kontrola mi hází při kompilaci chyby, které tam jsou, jen protože se vyžaduje statická typovost. Je to tak trochu začarovaný kruh. Na jednu stranu mě sice zarazí, pokud omylem použiju nějakou proměnnou na něco jiného (samozřejmě tedy jen pokud to má náhodou i jiný typ), ale na druhou stranu mi zase komplikuje práci, když by ta jedna proměnná klidně mohla obsahovat různorodá data.
Nechci hodnotit, co je lepší nebo horší, obojí má podle mě své místo a opodstatnění. Ale statické typování rozhodně žádné unit testování nenahrazuje.
(osobně mi statické typování překáží tím více, na čím vyšší úrovni abstrakce se pohybuji; na low-level záležitosti mi připadá jako naprosto perfektní)