Teste Unitário
É um teste feito pelo desenvolvedor, ele valida comportamento de unidades funcionais de código. Ou seja: testa os métodos de uma classe.
Um teste unitário NÃO pode acessar outros componentes ou recursos externos (arquivos, banco de dados, rede, web services, etc.).
Portanto, se estamos fazendo um teste unitário de um controlador, não podemos instanciar um Service/Repository e nem acessar banco, rede, nem nada do tipo.
A ideia é que a gente instancie um "mock", um objeto de "mentirinha" para simular o comportamento do objeto dependente, testando a UNIDADE de forma ISOLADA.
Atualizado