es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Existe alguna forma de realizar pruebas unitarias en un Mapstruct con un Mapper anidado?

Estoy tratando de realizar pruebas unitarias a un mapeador anidado de Mapstruct de la siguiente manera:

@Mapper(componentModel = "spring", uses = EventCategoryMapper.class, injectionStrategy = InjectionStrategy.CONSTRUCTOR)
public interface EventMapper {

    Event fromEventMO(EventMO eventMO);

    EventMO toEventMO(Event event);

    default Optional<event> fromOptionalEventMO(Optional<eventmo> optionalEventMO) {
        return (optionalEventMO.isEmpty()) ? Optional.empty() : Optional.of(fromEventMO(optionalEventMO.get()));
    }

}
@Mapper(componentModel = "spring", injectionStrategy = InjectionStrategy.CONSTRUCTOR)
public interface EventCategoryMapper {

    EventCategory fromEventCategoryMO(EventCategoryMO eventCategoryMO);

    EventCategoryMO toEventCategoryMO(EventCategory eventCategory);

    default String fromPriorityMO(PriorityMO priority) {
        return (priority.getPriority()==null) ? null : priority.getPriority();
    }

}

Estoy tratando de probar el EventMapper:

@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = {EventMapper.class, EventCategoryMapper.class, EventMapperImpl.class, EventCategoryMapperImpl.class})
public class EventMapperTest {

    private Mocks mocks; //Este objeto contiene los objetos mockeados que deben ser mapeados.

    @Autowired
    private EventMapper eventMapper;

    @Test
    @DisplayName("Should return an Event from an EventMO")
    void shouldReturnEventfromEventMO() {

        var event = eventMapper.fromEventMO(mocks.getEventMO());

        assertEquals(event.getId(), 123L);
    }

}

Pero sigue fallando con el siguiente mensaje de error:

Error al crear el bean con el nombre ‘eventMapper’: La instanciación del bean falló; excepción anidada es org.springframework.beans.BeanInstantiationException: Error al instanciar [com.mycompany.cna.projects.fishmarket.back.events.repositories.mappers.event.EventMapper]: La clase especificada es una interfaz.

Ya intenté instanciar el mapeador con Mapper.getMapper(EventMapper.class) y devuelve una NullPointerException.

¿Qué debo hacer para lograr pruebas unitarias en este tipo de mapeadores?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema está en cómo Spring intenta instanciar el mapeador basado en la interfaz. Una solución sería crear una implementación de la interfaz del mapeador y usar esa implementación en lugar de la interfaz para realizar pruebas.

    Para hacer esto, crea una implementación de la interfaz EventMapper de la siguiente manera:

    @Component
    public class EventMapperImpl implements EventMapper {
    
        private final EventCategoryMapper eventCategoryMapper;
    
        @Autowired
        public EventMapperImpl(EventCategoryMapper eventCategoryMapper) {
            this.eventCategoryMapper = eventCategoryMapper;
        }
    
        // implementa los métodos del mapeador aquí
        @Override
        public Event fromEventMO(EventMO eventMO) {
            // detalles de implementación
        }
    
        // otros métodos aquí
    }
    

    Y luego modifica la configuración de tu prueba para utilizar la implementación en lugar de la interfaz:

    @ExtendWith(SpringExtension.class)
    @ContextConfiguration(classes = {EventMapperImpl.class, EventCategoryMapperImpl.class})
    public class EventMapperTest {
        // resto de la prueba como antes
    }
    

    Esto debería resolver el problema y permitirte realizar pruebas unitarias en el mapeador.

Comments are closed.