一尘不染

@DataJpaTest需要测试之外的类

spring-boot

在SpringBoot应用程序中,我想对存储库层进行一些测试。

@RunWith(SpringRunner.class)
@DataJpaTest
public class VisitRepositoryTest {

     @Autowired
     private TestEntityManager entityManager;

     @Autowired
     private VisitRepository visitRepository;

     ...
}

当我尝试从进行测试时VisitRepositoryTest,出现错误消息DefaultConfigService

com.norc.Application中的字段defaultConfigService需要找不到类型为“
com.norc.service.DefaultConfigService”的bean。

那么这需要运行Application吗?

我试图把的豆 DefaultConfigServiceVisitRepositoryTest,但它是不允许的。

该类在我的应用中使用

@EntityScan(basePackageClasses = {Application.class, Jsr310JpaConverters.class})
@SpringBootApplication
@EnableScheduling
public class Application implements SchedulingConfigurer {

      @Autowired
      private DefaultConfigService defaultConfigService;
      ...
}

如何处理?


编辑

在我的应用程序中,我在 cron 选项卡中使用此类:

@Service
public class DefaultConfigServiceImpl implements DefaultConfigService {

    private final DefaultConfigRepository defaultConfigRepository;

    @Autowired
    public DefaultConfigServiceImpl(final DefaultConfigRepository defaultConfigRepository) {
         this.defaultConfigRepository = defaultConfigRepository;
    }
}

阅读 645

收藏
2020-05-30

共1个答案

一尘不染

问题是您@SpringBootApplication有一些有关计划的其他配置,并且通过在其中添加配置而没有@SpringBootConfiguration针对测试的自定义设置,这样的计划要求对所有内容都是强制性的。

让我们退后一步。添加后@DataJpaTest,Spring
Boot需要知道如何引导您的应用程序上下文。它需要找到您的实体和存储库。切片测试将递归搜索@SpringBootConfiguration::首先在实际测试包中,然后是父级,然后是父级,如果找不到,则会抛出异常。

@SpringBootApplication@SpringBootConfiguration这样,如果你没有做什么特别的东西,切片测试将使用您的应用为源动力的配置(这是国际海事组织,一个优秀的默认值)。

切片测试不会盲目地启动您的应用程序(否则就不会切片),因此我们要做的是禁用自动配置并为手头的任务自定义组件扫描(仅扫描实体和存储库,并在使用时忽略其余所有内容@DataJpaTest
。这对您来说是个问题,因为已应用了应用程序配置,并且计划材料应该可用。但是不对依赖的bean进行扫描。

在您的情况下,如果要使用切片,则调度配置应移至“ a”
SchedulingConfiguration或“某物”(如上所述,不会使用切片对其进行扫描)。无论如何,我认为将SchedulingConfigurer实现分开还是比较干净的。如果这样做,您会发现错误将消失。

现在让我们假设您想要该特定测试FooService也可用。您可以导入丢失的类,而不是像dimitrisli建议的那样启用组件扫描(这基本上是为您的配置禁用切片)。

@RunWith(SpringRunner.class)
@DataJpaTest
@Import(FooService.class)
public class VisitRepositoryTest {
  ...
}
2020-05-30