3
respostas

Problema com injeção de dependencia

Insira aqui a descrição dessa imagem para ajudar na acessibilidadeÉ possível observar que a classe UserService tem uma dependencia que é List updateUserVerifications que é gerenciada pelo spring quando a classe UserService é instanciada.

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Podemos observar que o método update chama essa lista de validações, tudo ok, mas em 1 TESTE DETERMINADO, eu não queria testar as validações dessa lista, pois já estão sendo testados em outro método, nesse teste em especifico eu gostaria de testar outras coisas que vem a baixo e não essa lista, não gostaria que essa lista fosse chamada, eu queria mocka-la.

Insira aqui a descrição dessa imagem para ajudar na acessibilidade A forma correta de fazer isso é como a print acima, como tem o contexto do spring de injeção de dependencia, como explicado anteriormente, eu preciso anotar o List de validações com MockBean para funcionar, mas de alguma forma, isso não funciona de jeito nenhum. Não consiga mockar uma lista, sendo essa lista, uma injeção de dependencia de outra classe, agora quando é simplesmente um objeto, o MockBean funciona corretamente, como um desses 2:

@MockBean private UserRepository userRepository;

@MockBean private AttributesListToUpdateService attributesListToUpdateService;

-----/----- Mas quando é uma lista :

@MockBean

private List updateUserVerifications;

não consigo mockar.

Como resolver isso?

3 respostas

Olá, Victor!

Entendo a sua situação e agradeço por compartilhar os detalhes. O problema que você está enfrentando é comum quando se trabalha com injeção de dependências e testes unitários em Spring.

Quando você tenta mockar a lista updateUserVerifications com @MockBean, o Spring tenta procurar um bean do tipo List<UpdateUserVerification> no contexto de aplicação, mas não consegue encontrar, pois o que você tem é uma lista de beans do tipo UpdateUserVerification.

Uma solução para isso seria criar um bean que encapsule essa lista e então você poderia mocká-lo. Por exemplo, você poderia criar uma classe UpdateUserVerificationListWrapper que contém a lista updateUserVerifications. Dessa forma, você pode injetar a dependência desta classe e mocká-la em seus testes.

@Service
public class UpdateUserVerificationListWrapper {
    private List<UpdateUserVerification> updateUserVerifications;

    // getters e setters
}

E nos seus testes, você poderia fazer algo como:

@MockBean
private UpdateUserVerificationListWrapper updateUserVerificationListWrapper;

// em algum lugar do seu código de teste
when(updateUserVerificationListWrapper.getUpdateUserVerifications()).thenReturn(new ArrayList<>());

Dessa forma, você está efetivamente mockando a lista updateUserVerifications.

Espero ter ajudado e bons estudos!

Oi!

Aqui tem um exemplo de como testar uma classe parecida com essa: https://github.com/alura-cursos/3349-boas-praticas-java-testes/blob/main/src/test/java/br/com/alura/adopet/api/service/AdocaoServiceTest.java

Fiz da maneira que o Matheus Brandino falou e funcionou mas estou em dúvida onde posso deixar essa classe Wrapper, poderia colocar na pasta utils ou eu poderia criar um pacote (wrapper) dentro do pacote service e colocar lá?