Acredito que exista um problema na implementação dos métodos "desconta". A lógica implementada executa o primeiro tipo de desconto encontrado e encerra o fluxo, ou seja, se houver mais de um tipo de desconto, os demais serão ignorados. O correto seria aplicar os descontos de forma cumulativa (caso seja essa a intenção).
Segue a correção a cada um dos métodos:
//DescontoPorMaisDeCincoItens
public double desconta(Orcamento orcamento) {
if (orcamento.getItens().size() > 5)
return orcamento.getValor() * 0.1 + proximo.desconta(orcamento);
else
return proximo.desconta(orcamento);
}
//DescontoPorMaisDeQuinhentosReais
public double desconta(Orcamento orcamento) {
if (orcamento.getValor() > 500)
return orcamento.getValor() * 0.07 + proximo.desconta(orcamento);
else
return proximo.desconta(orcamento);
}
//DescontoPorVendaCasada
public double desconta(Orcamento orcamento) {
if (aconteceuVendaCasadaEm(orcamento))
return orcamento.getValor() * 0.05 + proximo.desconta(orcamento);
else
return proximo.desconta(orcamento);
}