尝试模拟多个Java接口时出现问题

时间:2020-07-01 22:57:30

标签: java testing junit mocking mockito

我一直在使用DeltaSpike,Weld,Hibernate和其他框架针对Java上的旧版Web应用编写一些测试。 我的第一个测试类遇到了一些问题,该类在服务上注入了许多模拟接口。

让我显示一些代码: 服务待测试

public class DistribuicaoProcessoManualServiceImpl extends DistribuicaoService implements DistribuicaoProcessoManualService {
    
@Inject
@WebServiceTJDBEntityManager EntityManager wstjEM;  


private ForoTJComarcaMPRepository foroMPRepository;
private AssuntoTJNaturezaMPRepository naturezaMPRepository;
private VaraTJVaraMPRepository varaMPRepository;
private ClasseTJTipoMPRepository tipoMPRepository;
private ProcessoRepository processoRepository;
private UsuarioRepository usuarioRepository;
private UsuarioDaSessao usuarioDaSessao;

/**
 * @deprecated CDI eyes only
 */
public DistribuicaoProcessoManualServiceImpl() {
    this(null, null, null, null, null, null, null);
}

@Inject
public DistribuicaoProcessoManualServiceImpl(
        ForoTJComarcaMPRepository foroMPRepository,
        AssuntoTJNaturezaMPRepository naturezaMPRepository,
        ClasseTJTipoMPRepository tipoMPRepository,
        ProcessoRepository processoRepository,
        UsuarioRepository usuarioRepository,
        UsuarioDaSessao usuarioDaSessao,
        VaraTJVaraMPRepository varaMPRepository) {
    this.foroMPRepository = foroMPRepository;
    this.naturezaMPRepository = naturezaMPRepository;
    this.tipoMPRepository = tipoMPRepository;
    this.processoRepository = processoRepository;
    this.usuarioRepository = usuarioRepository;
    this.usuarioDaSessao = usuarioDaSessao;
    this.varaMPRepository = varaMPRepository;
}
    
        @Override
        @Transactional(readOnly = false, qualifier = {WebServiceTJDBEntityManager.class})
        public Processo vinculaOuPreparaParaEspecializacao(Processo processo) {
            
            //Service do some validations here with Guava's Preconditions;
            
            Usuario usuario = usuarioRepository.procurarPorLogin(usuarioDaSessao.getUsuario().getLogin());
            processo.atualizaInformacoesDeProcuradoriaEUsuario(usuario);
            
            ProcessoDoTJMapeamentoParaMP processoDePara = compoeMapeamento(processo);
            
            VaraTJVaraMP varaMP = varaMPRepository.procurarPorIdVaraTJForoEPorProcuradoria(processoDePara);
            
            ForoTJComarcaMP comarcaMP = foroMPRepository.procurarPorIdForoEPorProcuradoria(processoDePara);
            AssuntoTJNaturezaMP naturezaMP = naturezaMPRepository.procurarPorAssuntoEPorProcuradoria(processoDePara);
            ClasseTJTipoMP tipoMP = tipoMPRepository.procurarPorCodigoEPorProcuradoria(processoDePara);
            
            processoDePara
                .comComarcaMP(comarcaMP)
                .comVaraMP(varaMP)
                .comNaturezaMP(naturezaMP)
                .comTipoMP(tipoMP);
            
            processoRepository.inclui(processo);    
                
            return processo;
        }
    }

扩展类:

public abstract class DistribuicaoService {
    
    public ProcessoDoTJMapeamentoParaMP compoeMapeamento(Processo processo) {
        return new ProcessoDoTJMapeamentoParaMP(processo);
    }

}

映射器/构建器/聚合器:

public class ProcessoDoTJMapeamentoParaMP implements Serializable {

    private static final long serialVersionUID = 1L;
    
    private final Processo processo;

    public ProcessoDoTJMapeamentoParaMP(final Processo processo) {
        this.processo = processo;
        this.comCamaraMP( OrgaoJulgadorTJCamaraMP.semEfeito() )
                .comRelatorMP( RelatorTJRelatorMP.semEfeito() )
                .comOrigemMP( new OrgaoJulgadorTJOrigemMP() )
                .comTipoDeRemessaMP();
    }

    
    public ProcessoDoTJMapeamentoParaMP comComarcaMP(ComarcaMP comarcaMP) {
        processo.getDadosOrigem().setCodigoComarcaMP(comarcaMP.getIdComarca());
        return this;
    }

    public ProcessoDoTJMapeamentoParaMP comVaraMP(VaraMP varaMP) {
        processo.getDadosOrigem().setCodigoVaraMP(varaMP.getIdVaraMP());
        return this;
    }
    
    public ProcessoDoTJMapeamentoParaMP comNaturezaMP(AssuntoTJNaturezaMP naturezaMP) {
        processo.getAssuntoPrincipal().setCodigoNaturezaMP(naturezaMP.getIdNatureza());
        return this;
    }

    public ProcessoDoTJMapeamentoParaMP comTipoMP(ClasseTJTipoMP tipoMP) {
        processo.getDadosProcesso().getClasse().setCodigoTipoMP(tipoMP.getIdTipo());
        return this;
    }
    
    ProcessoDoTJMapeamentoParaMP comCamaraMP(OrgaoJulgadorTJCamaraMP camaraMP) {
        processo.getDadosDistribuicao().getMapeamento().setCodigoCamaraMP(camaraMP.getIdCamara());
        return this;
    }
    
    ProcessoDoTJMapeamentoParaMP comRelatorMP(RelatorTJRelatorMP relatorMP) {
        processo.getDadosDistribuicao().getMapeamento().setCodigoRelatorMP(relatorMP.getIdRelatorMP());
        return this;
    }
    
    ProcessoDoTJMapeamentoParaMP comOrigemMP(OrgaoJulgadorTJOrigemMP origemMP) {
        processo.getDadosDistribuicao().getMapeamento().setCodigoOrigemMP(origemMP.getIdOrigem());
        return this;
    }

    ProcessoDoTJMapeamentoParaMP comTipoDeRemessaMP() {
        processo.setTipoRemessa(TipoDeRemessa.fromTipoDeProcesso(this.processo.getProcessoVirtualTJ()));
        return this;
    }

    public Procuradoria getProcuradoria() {
        return processo.getProcuradoria();
    }

    public Integer getCodigoForoTJ() {
        return processo.getDadosOrigem().getCodigoForoPrimeiraInstancia();
    }

    public Integer getCodigoVaraTJ() {
        return processo.getDadosOrigem().getCodigoVaraPrimeiraInstancia();
    }

    public List<Parte> getPartes() {
        return processo.getPartes();
    }

    public String getNomeAssuntoTJ() {
        return processo.getAssuntoPrincipal().getDescricaoAssunto();
    }

    public Integer getCodigoClasseTJ() {
        return processo.getDadosProcesso().getClasse().getCodigoClasse();
    }
    
    public String getNomeOrgaoJulgadorTJ() {
        return processo.getDadosDistribuicao().getOrgaoJulgador().getNomeOrgaoJulgador();
    }
    
    public String getNomeRelatorTJ() {
        return processo.getDadosDistribuicao().getRelator().getNomeRelator();
    }
    
    public Integer getIdAssuntoTJ() {
        return processo.getAssuntoPrincipal().getCodigoAssunto();
    }


    public Movimentacao getUltimoMovimento() {
        return null;
    }

测试类:

@SuppressWarnings("deprecation")
@RunWith(MockitoJUnitRunner.class)
public class DistribuicaoProcessoManualServiceTest {
    
    
    @Mock private ForoTJComarcaMPRepository foroMPRepository;
    @Mock private AssuntoTJNaturezaMPRepository naturezaMPRepository;
    @Mock private VaraTJVaraMPRepository varaMPRepository;
    @Mock private ClasseTJTipoMPRepository tipoMPRepository;
    @Mock private ProcessoRepository processoRepository;
    @Mock private UsuarioRepository usuarioRepository;
    
    @Mock private Usuario usuario;
    @Mock private Procuradoria procuradoria;
    @Mock private VaraTJVaraMP varaMP;
    @Mock private ForoTJComarcaMP comarcaMP;
    @Mock private AssuntoTJNaturezaMP naturezaMP;
    @Mock private ClasseTJTipoMP tipoMP;
    @Mock private UsuarioDaSessao usuarioDaSessao;
    
    @InjectMocks    
    private DistribuicaoProcessoManualServiceImpl service = new DistribuicaoProcessoManualServiceImpl();
    
    
    private Processo processo;
    
    
    @Before
    public void setUpMethod() {
        initMocks(this);
        
        //Others Builders for populate "processo" here;
        
        processo = ProcessoBuilder()
                        .com(hoje)
                        .com(PARECER)
                        .com(FISICO)
                        .com(dadosProcesso)
                        .com(dadosOrigem)
                        .com(distribuicao)
                        .com(fila)
                        .cria();        
        
        ProcessoDoTJMapeamentoParaMP mapeamento = new ProcessoDoTJMapeamentoParaMP(processo);
        
        when(usuario.getLogin()).thenReturn("luizrodriguesj");
        when(usuario.getProcuradoria()).thenReturn(procuradoria);
        when(usuarioDaSessao.getUsuario()).thenReturn(usuario);
        when(usuarioRepository.procurarPorLogin(anyString())).thenReturn(usuario);
        
        when(comarcaMP.getIdComarca()).thenReturn(1);
        when(foroMPRepository.procurarPorIdForoEPorProcuradoria(mapeamento)).thenReturn(comarcaMP);
        
        when(varaMP.getIdVaraMP()).thenReturn(1);
        when(varaMPRepository.procurarPorIdVaraTJForoEPorProcuradoria(mapeamento)).thenReturn(varaMP);
        
        when(naturezaMP.getIdNatureza()).thenReturn(1);
        when(naturezaMPRepository.procurarPorAssuntoEPorProcuradoria(mapeamento)).thenReturn(naturezaMP);
        
        when(tipoMP.getIdTipo()).thenReturn(1);
        when(tipoMPRepository.procurarPorCodigoEPorProcuradoria(mapeamento)).thenReturn(tipoMP);        
        
    }

有问题的方法:

@Test(expected = ApplicationException.class)
public void naoPermitirDistribuicaoDeProcessoSemUmMapeamentoDeVaraCorrespondente() {
    service.vinculaOuPreparaParaEspecializacao(processo);
}

可以模拟的界面:

public interface UsuarioRepository extends GenericDAO<Usuario, Long> {
    
    boolean isAutenticavel(Usuario usuario);
    Usuario procurarPorLogin(String login);
    List<Usuario> lista(UsuarioPesquisa pesquisa, Paginacao paginacao);
}

不遵循指令模拟并返回null的接口之一:

public interface ForoTJComarcaMPRepository extends GenericDAO<ForoTJComarcaMP, Long> {

    ForoTJComarcaMP procurarPorIdForoEPorProcuradoria(ProcessoDoTJMapeamentoParaMP processoDePara);
    List<ForoTJComarcaMP> lista(DominioMPPesquisa pesquisa, Paginacao paginacao);
    ForoTJComarcaMP procuraPorForoTJ(ForoTJComarcaMP foroTJComarcaMP);
    ForoTJComarcaMP procuraPorEntidade(ForoTJComarcaMP clone);
    List<ForoTJComarcaMP> listaMapeamentoDistinctPor(Procuradoria procuradoria);
}

该类中的其他方法没有任何问题地运行之后,最后一个方法只是失败,因为发生在以下位置的NullPointerException(NPE):

VaraTJVaraMP varaMP = varaMPRepository.procurarPorIdVaraTJForoEPorProcuradoria(processoDePara);
AssuntoTJNaturezaMP naturezaMP = naturezaMPRepository.procurarPorAssuntoEPorProcuradoria(processoDePara);
ClasseTJTipoMP tipoMP = tipoMPRepository.procurarPorCodigoEPorProcuradoria(processoDePara);
ForoTJComarcaMP comarcaMP = foroMPRepository.procurarPorIdForoEPorProcuradoria(processoDePara);

....

// The references "comarcaMP", "varaMP", "naturezaMP", "tipoMP" are null here and next step throws a NPE.

processoDePara
            .comComarcaMP(comarcaMP)

其他模拟接口声明可以正常工作,就像这样:

Usuario usuario = usuarioRepository.procurarPorLogin(usuarioDaSessao.getUsuario().getLogin());

其中“ usuario”引用的设置如在测试类的设置方法中声明的那样。

对于任何错误或缺少更多信息表示抱歉。

感谢和问候!

0 个答案:

没有答案