Prev Next

Java / MapStruct Java Interview questions part 2

How do you unit test a MapStruct-generated mapper?

Because a MapStruct mapper compiles down to plain Java with no runtime magic, testing it needs nothing beyond a normal JUnit test - no mocking framework or reflection tricks are required.

class CarMapperTest {

    private final CarMapper mapper = Mappers.getMapper(CarMapper.class);

    @Test
    void mapsCarToDto() {
        Car car = new Car("Model X", 2024);
        CarDto dto = mapper.carToCarDto(car);

        assertEquals("Model X", dto.getModel());
        assertEquals(2024, dto.getYear());
    }
}

Because the mapper is generated at compile time, these tests double as a safety net for the mapping configuration itself - if a future @Mapping change accidentally breaks a property, the assertion catches it immediately rather than relying solely on the compiler warning being noticed.

Testing a MapStruct mapper typically requires:
A unit test on a generated mapper mainly guards against:

More Related questions...

What is MapStruct? What are the main features of MapStruct? What is the purpose of the @Mapper annotation? What are the types of mapping methods MapStruct can generate? How do you add MapStruct to a Maven project? How do you add MapStruct to a Gradle project? Define a MapStruct mapper interface? Describe how MapStruct generates the mapper implementation class? List the annotations commonly used with MapStruct? What is the purpose of the @Mapping annotation? How do you map fields with different names using MapStruct? How do you ignore a target field during mapping? What is the componentModel attribute in @Mapper? How do you use MapStruct with Spring Boot? What are default methods in a MapStruct mapper used for? How do you map a List of objects with MapStruct? What is the purpose of the uses attribute in @Mapper? How do you retrieve a mapper instance without Spring? What is the difference between MapStruct and ModelMapper? What is the difference between MapStruct and Dozer? Why is MapStruct faster than reflection-based mapping libraries? How does MapStruct handle nested object mapping? How does MapStruct map a Map to another Map type? How do you perform custom type conversion in MapStruct? Explain the internal working of MapStruct's annotation processing? Explain the execution flow of a generated MapStruct mapper method? How do you use @BeforeMapping and @AfterMapping? When should you use an expression inside @Mapping? How does MapStruct handle null values during mapping? What is the difference between NullValueMappingStrategy options? How do you inject dependencies into a MapStruct mapper? When would you choose an abstract class over an interface for a mapper? What happens when MapStruct can't find a matching source property? How do you use @InheritInverseConfiguration for bidirectional mapping? How do you use @InheritConfiguration to reuse mapping rules? Why doesn't MapStruct use reflection at runtime? How do you troubleshoot an "Unmapped target property" warning? What is the difference between @Mapper(uses =...) and a default method? How can you optimize MapStruct-generated mapping performance? Explain the lifecycle of a MapStruct mapper from source code to runtime call? How does MapStruct integrate with Lombok, and what issues can occur? What is the difference between returning a new object and using @MappingTarget? When should you use the @MappingTarget parameter? How do you map an enum to a different enum with mismatched constants? What is the difference between qualifiedByName and qualifiedBy? How does MapStruct handle circular references between objects? Why should you use MapStruct instead of hand-written DTO mapping code? How do you unit test a MapStruct-generated mapper? What is the difference between MapStruct's compile-time approach and CGLIB proxy-based mapping? How do you handle multiple mapping methods for the same source and target types?
Show more question and Answers...


Comments & Discussions