Map结构+Spring+Junit:将Map器插入服务类测试

kknvjkwl  于 2022-11-11  发布在  Spring
关注(0)|答案(1)|浏览(107)

我 正在 使用 Spring Boot 、 MapStruct ( 1.5.3.Final ) 和 JUnit 。 我 想 将 一 个 Map 器 注入 到 一 个 服务 类 测试 中 。 我 不 想 stub 这个 Map 器 ( when ( .. ) . thenReturn ( ... ) ) 。
我 已经 尝试 了 很多 东西 , 并 阅读 了 多 个 帖子 Stackoverflow , 但 我 发现 任何 东西 。

    • 我 的 Map 器 : * *
@Mapper(
        componentModel = MappingConstants.ComponentModel.SPRING,
        injectionStrategy = InjectionStrategy.CONSTRUCTOR
)
public interface ReservationMapper {

    @Mapping(target = "id", ignore = true)
    Reservation getReservationFrom(NewReservationSentByClient reservationData);

    ExistingReservation getExistingReservationFrom(Reservation reservation);
}

中 的 每 一 个

    • 使用 此 Map 器 的 服务 : * *
@Service
@RequiredArgsConstructor
@Slf4j
public class StandardReservationService implements ReservationService{
    private final ReservationMapper reservationMapper;
  ...

格式

    • 测试 类 * *
@RunWith(SpringRunner.class)
@SpringBootTest(classes={ReservationMapper.class})
public class StandardReservationServiceTest {

    @MockBean
    private ReservationRepository reservationRepositoryMock;
    @Autowired
    private ReservationMapper reservationMapperMock;
    @MockBean
    private ReservationRulesRepository reservationRulesRepositoryMock;
    @Autowired
    private StandardReservationService service;

    @ParameterizedTest
    @EnumSource(ReservationSource.class)
    public void ...

格式

    • pom . xml 文件 * *
<dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct</artifactId>
            <version>${org.mapstruct.version}</version>
        </dependency>

        <!-- TESTS -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
        </dependency>

    </dependencies>

    <build>
        <plugins>

            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.17</source>
                    <target>1.17</target>
                    <annotationProcessorPaths>
                        <path>
                            <groupId>org.mapstruct</groupId>
                            <artifactId>mapstruct-processor</artifactId>
                            <version>${org.mapstruct.version}</version>
                        </path>
                        <path>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                            <version>${lombok.version}</version>
                        </path>
                        <path>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok-mapstruct-binding</artifactId>
                            <version>0.2.0</version>
                        </path>
                    </annotationProcessorPaths>
                </configuration>
            </plugin>

        </plugins>
    </build>

格式
我 试探 着 :

  • 在@SpringBootTest ( classes = {..} ) 中 传递 ReservationMapperImpl.class , 但 在 全新 安装 时 未 找到 此 实现
  • 手动 示例 化 ReservationMapperImpl , 但 在 全新 安装 时 出现 相同 问题
  • ... 等等

如果 可能 的 话 , 我 不 想 使用@SpringBootTest , 因为 我 正在 编写 单元 测试 , 所以 我 不 需要 上下文 .. 但 我 不 想 手动 创建 对象 Map 并 将 其 存根 。

5lhxktic

5lhxktic1#

你应该试试

private ReservationMapper reservationMapper = Mappers.getMapper(ReservationMapper.class);

并删除@Autowired注解。这应该会给予Map器的真实的实现。

相关问题