[quote=rponte]
Se houver necessidade de fazer alguns testes unitários em que seja complicado mockar o EntityManager então acredito que neste lugar seja melhor um DAO ou mesmo Repository. Para os demais casos testes de integração pode ser um melhor caminho.
O importante é não generalizar tudo apenas por questões de convenções da arquitetura.[/quote]
hummm… Uma regra importante na moda, no design e na arquitetura e que se aplica aqui é : less is more.
Menos é mais. O que singifica isto ? Básicamente significa que mesmo que vc possa fazer algo (Adicionar) isso não significa que deva.
O que separa o poder do dever e do fazer é uma linha ténue , dificil de enxergar e que requer algum tipo de visão especial tipo visão de raio-X do super-homem. O que quero dizer com isto é que é facil dizer “não vamos fazer isso porque a arquitetura manda, vamos fazer isto aqui porque é mais simples” … o buraco escorregadio aqui é o que significa “simples”. Para os mais desatentos “simples” significa “mais depressa” ou “já sei fazer”. Ora isso é uma forma muito egoísta de olha a construção do sistema. “Simples” deve significar isso mesmo “simples” e não “o jeito que eu achei mais rápido para tirar o meu da reta” ( isto tem outro nome : gambiarra).
Cada vez decide não pensar, estudar ou pesquisar sobre um problema e tira uma solução da cartola vc está criando mau design (aka gamb) que no fim vai vir de noite e engolir você… não veio ainda? é porque ainda está no fim.
Só porque existe um jmock isso significa que posso sair por ai mockando todo e qualquer objeto ?
Se levarmos à letra sim, mas se usarmos o principio do menos é mais, mockar menos é melhor. Mockar Thead seria impossível ou quase tão dificil como criar um novo mecanismo de paralelismo. Fazer um mock tem que ter um objetivo e tem que ser o ultimo recurso. Por exemplo, se vc tem um serviço com interface S e quer criar um tipo particular para usar em testes vc criar uma implementação STest. Repare que vc está criando um mock, mas não usando uma ferramenta de mock. Isso significa , então , que vc está implementando uma outra “encarnação” de S. Isso é extremante util para entender se o design de S está correto ( é desacoplado e conciso) , se o seu tratamento/modelagem de exceção é coerente e util, se os tipos de retorno e entrada são genéricos e simples de construir. Usando o jmock vc não entenderia isso.
Acho que - e não é de agora - a maioria aqui vê o filme ao contrário. Todo o mundo fala que “generalizar” é mau. Se fosse tão mau assim , será que OO seria baseado em abstrações - que são uma forma de generalização ? Não.
Quando vc pensa em design vc pensa em abstrato. Vc imagina contratos, interfaces, trocas de mensagens. Vc não imagina codigo, classes, corpos de método, ou fica preocupado com o tempo de codificação.
Codificar um hibernate da vida é extremante complexo. Existem muitos items ligados a performance. Mas o modelo ? o modelo é o mais abstrato que pode ser. E ai que está o poder dessa biblioteca, não na sua implementação.
Programadores utilizam-se dos contratos dos objetos, nãos das implementações. Então, um bom codigo, um bom design, um bom sistema é aquele que tem bons contratos.
Enfim, tudo isto para dizer que não é irrelevante a escolha entre isolar ou não o entitymanager. isolá-lo é inerentemente mais vantajoso e isso, eu acho, é muito obvio. Se essa a forma que minimiza todos os problemas, porque usar outra ? mesmo que essa outra pareça mais simples , não será a melhor.
Porquê negar o que é bom ? isso não faz sentido para mim.