1.1.60. fejezet, MapStruct

Kapcsolódó hivatkozások

build.gradle

dependencies {
    implementation "org.mapstruct:mapstruct:1.6.3"
    annotationProcessor "org.projectlombok:lombok-mapstruct-binding:0.2.0"
...
    annotationProcessor "org.mapstruct:mapstruct-processor:1.6.3"
...
    testImplementation "org.mapstruct:mapstruct:1.6.3"
    testAnnotationProcessor "org.mapstruct:mapstruct-processor:1.6.3"
}

Minta Mapper

package hu.infokristaly.kafkaproducer;
 
import hu.infokristaly.kafkaconsumer.avro.User;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
 
@Mapper(componentModel = "spring", uses = {})
public interface UserMapper {
    @Mapping(target = "name", source = "name")
    @Mapping(target = "favoriteNumber", source = "favoriteNumber")
    @Mapping(target = "favoriteColor", source = "favoriteColor")
    User from(UserDTO userDTO);
}

Teszt minta

package hu.infokristaly.kafkaproducer;
 
import hu.infokristaly.kafkaconsumer.avro.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.test.context.ActiveProfiles;
 
@SpringBootTest
@ComponentScan(basePackages = "hu.infokristaly.kafkaproducer")
@ActiveProfiles("test")
class KafkaproducerApplicationTests {
 
    @Autowired
    private UserMapper userMapper;
 
    @Test
    void contextLoads() {
        assert userMapper != null;
        UserDTO userDTO = new UserDTO();
        userDTO.setName("Teszt Elek");
        userDTO.setFavoriteColor("piros");
        userDTO.setFavoriteNumber(13);
        User user = userMapper.from(userDTO);
        assert user.getName().equals(userDTO.getName()) : "The name doesn't equal";
        assert user.getFavoriteColor().equals(userDTO.getFavoriteColor()) : "The favourite color doesn't match";
        assert user.getFavoriteNumber() == userDTO.getFavoriteNumber() : "The favourite number doesn't match";
    }
 
}

Ne felejtsük el a test/resources mappát létrehozni, és ide elhelyezni az application-test.properties állományt (amiben ne legyen környezeti változóra hivatkozás), különben valami hasonló üzenetet kapunk:

KafkaproducerApplicationTests > contextLoads() FAILED
    java.lang.IllegalStateException at DefaultCacheAwareContextLoaderDelegate.java:180
        Caused by: org.springframework.beans.factory.BeanCreationException at AutowiredAnnotationBeanPostProcessor.java:515
            Caused by: org.springframework.util.PlaceholderResolutionException at PlaceholderResolutionException.java:81

Kafka Avro consumer application-test.properties

spring.kafka.bootstrap-servers=localhost:9092
spring.kafka.properties.sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username='user1' password='test123';
spring.kafka.properties.sasl.mechanism=PLAIN
spring.kafka.properties.security.protocol=SASL_PLAINTEXT
spring.kafka.producer.acks=all
avro.schema_registry.url=http://localhost:8081