@DataJpaTest需要在测试之外的类

2022-09-02 00:03:11

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

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

     @Autowired
     private TestEntityManager entityManager;

     @Autowired
     private VisitRepository visitRepository;

     ...
}

当我尝试从 运行测试时,我收到一个错误VisitRepositoryTestDefaultConfigService

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;
    }
}

答案 1

问题在于,您有一些关于调度的额外配置,并且通过添加该配置并且没有用于测试的自定义,因此此类调度要求对于所有内容都是必需的。@SpringBootApplication@SpringBootConfiguration

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

@SpringBootApplication因此,如果您不执行任何特殊操作,切片测试将使用您的应用程序作为配置源(这是IMO,一个很好的默认值)。@SpringBootConfiguration

切片测试不会盲目地启动您的应用程序(否则就不会切片),因此我们所做的是禁用自动配置并为手头的任务自定义组件扫描(仅扫描实体和存储库,并在使用时忽略所有其他内容)。这对你来说是一个问题,因为应用程序配置已经应用,调度的东西应该可用。但是依赖的豆子不会被扫描。@DataJpaTest

在你的例子中,如果你想使用切片,调度配置应该移动到一个或什么(它不会像上面解释的那样用切片扫描)。无论如何,我认为无论如何分离实现都更干净。如果这样做,您会注意到错误将消失。SchedulingConfigurationSchedulingConfigurer

现在让我们假设您希望该特定测试也可用。与其像 dimitrisli 建议的那样启用组件扫描(这基本上是禁用配置切片),不如只导入缺少的类FooService

@RunWith(SpringRunner.class)
@DataJpaTest
@Import(FooService.class)
public class VisitRepositoryTest {
  ...
}

答案 2

推荐