Cómo convertir adecuadamente las entidades de dominio a DTO mientras se considera la escalabilidad y la capacidad de prueba

He leído varios artículos y publicaciones de Stackoverflow para convertir objetos de dominio en DTO y los probé en mi código. Cuando se trata de pruebas y escalabilidad, siempre enfrento algunos problemas. Conozco las siguientes tres posibles soluciones para convertir objetos de dominio a DTO. La mayoría de las veces estoy usando Spring.

Solución 1: método privado en la capa de servicio para convertir

La primera solución posible es crear un pequeño método "auxiliar" en el código de la capa de servicio que convierte el objeto de base de datos recuperado en mi objeto DTO.

@Service
public MyEntityService {

  public SomeDto getEntityById(Long id){
    SomeEntity dbResult = someDao.findById(id);
    SomeDto dtoResult = convert(dbResult);
    // ... more logic happens
    return dtoResult;
  }

  public SomeDto convert(SomeEntity entity){
   //... Object creation and using getter/setter for converting
  }
}

Pros:

fácil de implementarno se necesita clase adicional para la conversión -> el proyecto no explota con entidades

Contras:

problemas al probar, comonew SomeEntity() se usa en el método privado y si el objeto está profundamente anidado, tengo que proporcionar un resultado adecuado de miwhen(someDao.findById(id)).thenReturn(alsoDeeplyNestedObject) para evitar NullPointers si la conversión también está disolviendo la estructura anidada

Solución 2: constructor adicional en el DTO para convertir la entidad de dominio a DTO

Mi segunda solución sería agregar un constructor adicional a mi entidad DTO para convertir el objeto en el constructor.

public class SomeDto {

 // ... some attributes

 public SomeDto(SomeEntity entity) {
  this.attribute = entity.getAttribute();
  // ... nesting convertion & convertion of lists and arrays
 }

}

Pros:

no se necesita clase adicional para convertirconversión oculta en la entidad DTO -> el código de servicio es más pequeño

Contras:

uso denew SomeDto() en el código de servicio y por lo tanto tengo que proporcionar la estructura de objeto anidada correcta como resultado de misomeDao burlón.

Solución 3: Usando Spring's Converter o cualquier otro Bean externo para esta conversión

Si recientemente vimos que Spring está ofreciendo una clase por razones de conversión:Converter<S, T> pero esta solución representa todas las clases externalizadas que realizan la conversión. Con esta solución, estoy inyectando el convertidor a mi código de servicio y lo llamo cuando quiero convertir la entidad de dominio a mi DTO.

Pros:

fácil de probar ya que puedo burlarme del resultado durante mi caso de pruebaseparación de tareas -> una clase dedicada está haciendo el trabajo

Contras:

no "escala" tanto como crece mi modelo de dominio. Con muchas entidades, tengo que crear dos convertidores para cada nueva entidad (-> convertir la entidad DTO y la entidad a DTO)

¿Tiene más soluciones para mi problema y cómo lo maneja? ¿Crea un nuevo convertidor para cada nuevo objeto de dominio y puede "vivir" con la cantidad de clases en el proyecto?

¡Gracias por adelantado!

Respuestas a la pregunta(4)

Su respuesta a la pregunta