Estou usando o Mockito @Mock
e as @InjectMocks
anotações para injetar dependências em campos particulares anotados no Spring @Autowired
:
@RunWith(MockitoJUnitRunner.class)
public class DemoTest {
@Mock
private SomeService service;
@InjectMocks
private Demo demo;
/* ... */
}
e
public class Demo {
@Autowired
private SomeService service;
/* ... */
}
Agora eu também gostaria de injetar objetos reais em @Autowired
campos privados (sem setters). Isso é possível ou o mecanismo está limitado apenas à injeção de Mocks?
MockitoAnnotations.initMocks(this);
o@Before
método. Eu sei que não está diretamente relacionado à pergunta original, mas a qualquer um que aparecer mais tarde, isso precisará ser adicionado para tornar isso rodável.@RunWith(MockitoJUnitRunner.class)
), você não precisa da linhaMockitoAnnotations.initMocks(this);
Respostas:
Usar
@Spy
anotaçãoO Mockito considerará todos os campos que possuem
@Mock
ou@Spy
anotação como candidatos potenciais a serem injetados na instância anotada com@InjectMocks
anotação. No caso acima, a'RealServiceImpl'
instância será injetada na 'demo'Para mais detalhes consulte
Mockito-home
@Espião
@Zombar
fonte
Mockito cannot mock/spy following: - final classes - anonymous classes - primitive types
new RealServiceImpl()
,@Spy private SomeService service;
cria um objeto real usando o construtor padrão antes de espioná-lo de qualquer maneira.Além da resposta @Dev Blanked, se você quiser usar um bean existente criado pelo Spring, o código poderá ser modificado para:
Dessa forma, você não precisa alterar seu código (adicione outro construtor) apenas para fazer os testes funcionarem.
fonte
Autowired
campos das dependências fossem criados corretamente.Mockito não é uma estrutura DI e até mesmo estruturas DI incentivam injeções de construtores sobre injeções de campo.
Então você apenas declara um construtor para definir dependências da classe em teste:
Usar o Mockito
spy
para o caso geral é um péssimo conselho. Isso torna a classe de teste quebradiça, não direta e propensa a erros: o que é realmente ridicularizado? O que é realmente testado?@InjectMocks
e@Spy
também prejudica o design geral, pois incentiva classes inchadas e responsabilidades mistas nas classes.Por favor, leia o
spy()
javadoc antes de usá-lo cegamente (a ênfase não é minha):fonte
Na primavera, há um utilitário dedicado chamado
ReflectionTestUtils
para esse fim. Pegue a instância específica e injete no campo.fonte
Sei que essa é uma pergunta antiga, mas fomos confrontados com o mesmo problema ao tentar injetar Strings. Por isso, inventamos uma extensão JUnit5 / Mockito que faz exatamente o que você deseja: https://github.com/exabrial/mockito-object-injection
EDITAR:
fonte