diff --git a/mapstruct-2/pom.xml b/mapstruct-2/pom.xml
index ed2cb8f39f48..72c6aeae386e 100644
--- a/mapstruct-2/pom.xml
+++ b/mapstruct-2/pom.xml
@@ -25,6 +25,18 @@
${lombok.version}
provided
+
+ org.springframework
+ spring-context
+ ${springframework.version}
+ test
+
+
+ org.springframework
+ spring-test
+ ${springframework.version}
+ test
+
mapstruct-2
@@ -60,6 +72,7 @@
1.6.3
0.2.0
+ 6.2.1
diff --git a/mapstruct-2/src/main/java/com/baeldung/dto/MediaDto.java b/mapstruct-2/src/main/java/com/baeldung/dto/MediaDto.java
new file mode 100644
index 000000000000..cbe9510145be
--- /dev/null
+++ b/mapstruct-2/src/main/java/com/baeldung/dto/MediaDto.java
@@ -0,0 +1,37 @@
+package com.baeldung.dto;
+
+public class MediaDto {
+
+ private Long id;
+
+ private String title;
+
+ public MediaDto(Long id, String title) {
+ this.id = id;
+ this.title = title;
+ }
+
+ public MediaDto() {
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ @Override
+ public String toString() {
+ return "MediaDto{" + "id=" + id + ", title='" + title + '\'' + '}';
+ }
+}
diff --git a/mapstruct-2/src/main/java/com/baeldung/entity/Media.java b/mapstruct-2/src/main/java/com/baeldung/entity/Media.java
new file mode 100644
index 000000000000..4b11472a46e1
--- /dev/null
+++ b/mapstruct-2/src/main/java/com/baeldung/entity/Media.java
@@ -0,0 +1,37 @@
+package com.baeldung.entity;
+
+public class Media {
+
+ private Long id;
+
+ private String title;
+
+ public Media(Long id, String title) {
+ this.id = id;
+ this.title = title;
+ }
+
+ public Media() {
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ @Override
+ public String toString() {
+ return "Media{" + "id=" + id + ", title='" + title + '\'' + '}';
+ }
+}
diff --git a/mapstruct-2/src/main/java/com/baeldung/mapper/MediaMapper.java b/mapstruct-2/src/main/java/com/baeldung/mapper/MediaMapper.java
new file mode 100644
index 000000000000..2629a1820a3e
--- /dev/null
+++ b/mapstruct-2/src/main/java/com/baeldung/mapper/MediaMapper.java
@@ -0,0 +1,15 @@
+package com.baeldung.mapper;
+
+import org.mapstruct.Mapper;
+
+import com.baeldung.dto.MediaDto;
+import com.baeldung.entity.Media;
+
+@Mapper
+public interface MediaMapper {
+
+ MediaDto toDto(Media media);
+
+ Media toEntity(MediaDto mediaDto);
+
+}
diff --git a/mapstruct-2/src/main/java/com/baeldung/service/MediaService.java b/mapstruct-2/src/main/java/com/baeldung/service/MediaService.java
new file mode 100644
index 000000000000..2e0fcf064ab1
--- /dev/null
+++ b/mapstruct-2/src/main/java/com/baeldung/service/MediaService.java
@@ -0,0 +1,26 @@
+package com.baeldung.service;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.baeldung.dto.MediaDto;
+import com.baeldung.entity.Media;
+import com.baeldung.mapper.MediaMapper;
+
+public class MediaService {
+
+ final Logger logger = LoggerFactory.getLogger(MediaService.class);
+
+ private final MediaMapper mediaMapper;
+
+ public MediaService(MediaMapper mediaMapper) {
+ this.mediaMapper = mediaMapper;
+ }
+
+ public Media persistMedia(MediaDto mediaDto) {
+ Media media = mediaMapper.toEntity(mediaDto);
+ logger.info("Persist media: {}", media);
+ return media;
+ }
+
+}
diff --git a/mapstruct-2/src/test/java/com/baeldung/service/MediaServiceGeneratedMapperUnitTest.java b/mapstruct-2/src/test/java/com/baeldung/service/MediaServiceGeneratedMapperUnitTest.java
new file mode 100644
index 000000000000..32a8873403a3
--- /dev/null
+++ b/mapstruct-2/src/test/java/com/baeldung/service/MediaServiceGeneratedMapperUnitTest.java
@@ -0,0 +1,23 @@
+package com.baeldung.service;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.mapstruct.factory.Mappers;
+
+import com.baeldung.dto.MediaDto;
+import com.baeldung.entity.Media;
+import com.baeldung.mapper.MediaMapper;
+
+public class MediaServiceGeneratedMapperUnitTest {
+
+ @Test
+ public void whenGeneratedMapperIsUsed_thenActualValuesAreMapped() {
+ MediaService mediaService = new MediaService(Mappers.getMapper(MediaMapper.class));
+ MediaDto mediaDto = new MediaDto(1L, "title 1");
+ Media persisted = mediaService.persistMedia(mediaDto);
+ assertEquals(mediaDto.getId(), persisted.getId());
+ assertEquals(mediaDto.getTitle(), persisted.getTitle());
+ }
+
+}
diff --git a/mapstruct-2/src/test/java/com/baeldung/service/MediaServiceMockedMapperUnitTest.java b/mapstruct-2/src/test/java/com/baeldung/service/MediaServiceMockedMapperUnitTest.java
new file mode 100644
index 000000000000..a956b29fd586
--- /dev/null
+++ b/mapstruct-2/src/test/java/com/baeldung/service/MediaServiceMockedMapperUnitTest.java
@@ -0,0 +1,32 @@
+package com.baeldung.service;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import org.junit.Test;
+
+import com.baeldung.dto.MediaDto;
+import com.baeldung.entity.Media;
+import com.baeldung.mapper.MediaMapper;
+
+public class MediaServiceMockedMapperUnitTest {
+
+ @Test
+ public void whenMockedMapperIsUsed_thenMockedValuesAreMapped() {
+ MediaMapper mockMediaMapper = mock(MediaMapper.class);
+ Media mockedMedia = new Media(5L, "Title 5");
+ when(mockMediaMapper.toEntity(any())).thenReturn(mockedMedia);
+
+ MediaService mediaService = new MediaService(mockMediaMapper);
+ MediaDto mediaDto = new MediaDto(1L, "title 1");
+ Media persisted = mediaService.persistMedia(mediaDto);
+
+ verify(mockMediaMapper).toEntity(mediaDto);
+ assertEquals(mockedMedia.getId(), persisted.getId());
+ assertEquals(mockedMedia.getTitle(), persisted.getTitle());
+ }
+
+}
diff --git a/mapstruct-2/src/test/java/com/baeldung/spring/Config.java b/mapstruct-2/src/test/java/com/baeldung/spring/Config.java
new file mode 100644
index 000000000000..e3f952b5d838
--- /dev/null
+++ b/mapstruct-2/src/test/java/com/baeldung/spring/Config.java
@@ -0,0 +1,17 @@
+package com.baeldung.spring;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import com.baeldung.mapper.MediaMapper;
+import com.baeldung.service.MediaService;
+
+@Configuration
+public class Config {
+
+ @Bean
+ public MediaService mediaService(MediaMapper mediaMapper) {
+ return new MediaService(mediaMapper);
+ }
+
+}
diff --git a/mapstruct-2/src/test/java/com/baeldung/spring/MediaServiceSpringGeneratedMapperUnitTest.java b/mapstruct-2/src/test/java/com/baeldung/spring/MediaServiceSpringGeneratedMapperUnitTest.java
new file mode 100644
index 000000000000..e061dbb628fd
--- /dev/null
+++ b/mapstruct-2/src/test/java/com/baeldung/spring/MediaServiceSpringGeneratedMapperUnitTest.java
@@ -0,0 +1,30 @@
+package com.baeldung.spring;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import com.baeldung.dto.MediaDto;
+import com.baeldung.entity.Media;
+import com.baeldung.service.MediaService;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(classes = { Config.class, MediaSpringMapperImpl.class })
+public class MediaServiceSpringGeneratedMapperUnitTest {
+
+ @Autowired
+ MediaService mediaService;
+
+ @Test
+ public void whenGeneratedSpringMapperIsUsed_thenActualValuesAreMapped() {
+ MediaDto mediaDto = new MediaDto(1L, "title 1");
+ Media persisted = mediaService.persistMedia(mediaDto);
+ assertEquals(mediaDto.getId(), persisted.getId());
+ assertEquals(mediaDto.getTitle(), persisted.getTitle());
+ }
+
+}
diff --git a/mapstruct-2/src/test/java/com/baeldung/spring/MediaServiceSpringMockedMapperUnitTest.java b/mapstruct-2/src/test/java/com/baeldung/spring/MediaServiceSpringMockedMapperUnitTest.java
new file mode 100644
index 000000000000..a7799e6ebc94
--- /dev/null
+++ b/mapstruct-2/src/test/java/com/baeldung/spring/MediaServiceSpringMockedMapperUnitTest.java
@@ -0,0 +1,42 @@
+package com.baeldung.spring;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentMatchers;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.bean.override.mockito.MockitoBean;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import com.baeldung.dto.MediaDto;
+import com.baeldung.entity.Media;
+import com.baeldung.service.MediaService;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(classes = Config.class)
+public class MediaServiceSpringMockedMapperUnitTest {
+
+ @Autowired
+ MediaService mediaService;
+
+ @MockitoBean
+ MediaSpringMapper mockMediaMapper;
+
+ @Test
+ public void whenMockedSpringMapperIsUsed_thenMockedValuesAreMapped() {
+ Media mockedMedia = new Media(12L, "title 12");
+ when(mockMediaMapper.toEntity(ArgumentMatchers.any())).thenReturn(mockedMedia);
+
+ MediaDto mediaDto = new MediaDto(1L, "title 1");
+ Media persisted = mediaService.persistMedia(mediaDto);
+
+ verify(mockMediaMapper).toEntity(mediaDto);
+ assertEquals(mockedMedia.getId(), persisted.getId());
+ assertEquals(mockedMedia.getTitle(), persisted.getTitle());
+ }
+
+}
diff --git a/mapstruct-2/src/test/java/com/baeldung/spring/MediaSpringMapper.java b/mapstruct-2/src/test/java/com/baeldung/spring/MediaSpringMapper.java
new file mode 100644
index 000000000000..d752fee2291f
--- /dev/null
+++ b/mapstruct-2/src/test/java/com/baeldung/spring/MediaSpringMapper.java
@@ -0,0 +1,10 @@
+package com.baeldung.spring;
+
+import org.mapstruct.Mapper;
+import org.mapstruct.MappingConstants;
+
+import com.baeldung.mapper.MediaMapper;
+
+@Mapper(componentModel = MappingConstants.ComponentModel.SPRING)
+public interface MediaSpringMapper extends MediaMapper {
+}