Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Testando injeção de dependencias com spring

Olá galera, estou com o seguinte problema,

Estou fazendo o teste de um web service em spring, tenho as seguintes classes:

Clase de teste: chama o endpoint de inclusao.

Classe endpoint: chama o serviço de inclusao.

Classe de inclusao: chama os serviços de validação, inclui o serviço e gera a resposta

Segue as classes:

public class InclusaoEndpointTest {

    private InclusaoEndpoint inclusaoEndpoint = new InclusaoEndpoint();
    private IncluirAverbacaoRequest request = new IncluirAverbacaoRequest();

    @Test
    public void testaServicoInclusaoAverbacao() {

        // codigos de configuração da requisição

        IncluirAverbacaoResponse retorno = inclusaoEndpoint.incluirAverbacao(request);

    //Faz os asserts
    }
}

public class InclusaoEndpoint {

    @Autowired
    @Qualifier("inclusaoService")
    private InclusaoService inclusaoService;

    public static final String NAMESPACE_URI =  "url";

    /**
     * @param request
     * @return
     */
    @PayloadRoot(namespace = NAMESPACE_URI, localPart = "IncluirAverbacaoRequest")
    @ResponsePayload
    public IncluirAverbacaoResponse incluirAverbacao(@RequestPayload IncluirAverbacaoRequest request) {

        return inclusaoService.incluir(request);
    }

}

@Service
public class InclusaoService {

    @Autowired
    private InclusaoConnection inclusaoConnection;

    @Autowired
    private InclusaoDePara inclusaoDePara;

    /**
     * @param request
     * @return
     */
    public IncluirAverbacaoResponse incluir(IncluirAverbacaoRequest request) {
// aqui chama os serviços que fazem as validações e montam a resposta e depois devolve ela
return incluirAverbacaoResponse;
    }
}

Agora o meu problema: as classes utilizam a injeção de dependencias do spring, e quero saber como faço para que o spring injete as dependencias quando eu rodar a classe do teste?

Pois quando rodo o teste do jeito atual ele me devolve um NPE

OBS: Se eu instanciar na mão os atributos(objetos) o teste passa! Ex:

private InclusaoService inclusaoService = new InclusaoService();

Desde já agradeço a todos que se disponibilizarem a me ajudar.

4 respostas

Oi Antônio, tudo bem?

O que normalmente eu faço com os testes e vejo muita gente fazendo é mocks das dependências da classe q vc quer testar, já tentou ver dessa forma?

Muitas vezes a gente não quer o framework fazendo a injeção de dependências pra gente em cenários de teste.

De qualquer forma tenta marcar sua classe de teste com, acredito que isso resolva!

@RunWith(SpringJUnit4ClassRunner.class)

Abraços!

Tudo beleza e você Yuri,

Obrigado pela dica, acontece que se eu utilizar o mocks ele não passa pelas minhas outras classes, ele apenas simularia que deu certo, mas nesse caso de fato preciso que ele passe pelas classes processando os dados.

Também utilizei o :

@RunWith(SpringJUnit4ClassRunner.class)

mas ainda sim ele devolve NPE.

Obrigado pela colaboração.

Beleza também!

Mas então, quando queremos testar uma classe com testes de unidade, queremos testar só ela, as dependências dela não é uma coisa com a qual queremos nos preocupar, por isso podemos simular o comportamento delas com mocks. Repare que o ideal é todo o seu código estar coberto pelos testes de unidade, cada classe com o seu teste, portanto as dependências da sua classe vão ter seus próprios códigos de teste, livrando os testes de uma classe especifica de ter que se preocupar com os testes de sua dependência.

Mas de qualquer forma, já tentou passar a sua classe ou arquivo de configuração?

@ContextConfiguration(classes=AppConfig.class)

Isso também anotado na classe de teste, junto com a outra notation que falamos.

Repare que nesse caso o parâmetro é o AppConfig.class, no seu caso seria a sua classe de config, no caso do springboot seria aquela q tem o main que vem com a aplicação.

Abraço!

solução!

Bom dia Yuri, agradeço pela explicação e disposição em me ajudar. realmente o problema é que quando utilizo o mock a cobertura não reconhe como um teste válido (o sonar aponta como não coberto), mas felizmente olhando a documentação do spring consegui resolver o problema, abaixo a solução:

Criei uma classe abstrata (pai) de teste (vazia) que recebe as configurações do sistema pelo spring:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = EcoSrvFacil.class, webEnvironment = WebEnvironment.RANDOM_PORT)
@ActiveProfiles("dev")
public abstract class EcoSrvFacilAbstractTest {

}

essa classe serve como base para eu testar todos os serviços da minha aplicação, afinal ela é o pai e todos os serviços vem dela.

e na minha classe de teste do serviço eu herdei a classe pai do sistema

public class InclusaoEndpointTest extends EcoSrvFacilAbstractTest

além disso ao invéz de instanciar o meu endpoint eu utilizei o @Autowired do spring para fazer a injeção de dependencias, a ai estava o problema, quando eu instanciava ele na mão ele não recebia as dependencias, e por isso voltava um NPE. Utilizando a injeção ele instancia meu endpoint e injeta as minhas dependencias.

@Autowired
private InclusaoEndpoint inclusaoEndpoint;

Essa foi minha solução.

Agradeço novamente pelo apoio.

Obrigado, abçs.