@DataJpaTest需要考试以外的课程

时间:2016-12-10 23:57:05

标签: java spring gradle spring-boot spring-test

在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

我尝试在DefaultConfigService中添加VisitRepositoryTest的bean,但不允许这样做。

此类用于我的应用

@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 个答案:

答案 0 :(得分:32)

问题在于,您的@SpringBootApplication有一些关于日程安排的额外配置,并且通过在其中添加并且没有用于测试的自定义@SpringBootConfiguration,这样的调度要求对于所有内容都是必需的。

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

@SpringBootApplication@SpringBootConfiguration所以如果您没有做任何特别的事情,切片测试会将您的应用作为配置来源(这是IMO,一个很好的默认设置)。

切片测试不会盲目地启动你的应用程序(否则它不会切片)所以我们所做的是禁用自动配置并为手头的任务定制组件扫描(仅扫描实体和存储库并忽略所有使用@DataJpaTest时休息。这是一个问题,因为应用了应用程序配置并且调度内容应该可用。但是依赖的豆子没有被扫描过。

在您的情况下,如果您想使用切片,则调度配置应移至SchedulingConfiguration或其他内容(如上所述,不会使用切片进行扫描)。无论如何,我认为将SchedulingConfigurer实现分开是更清晰。如果你这样做,你会发现错误会消失。

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

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