@DataJpaTest需要在测试之外的类

rob*_*del 12 java spring spring-test gradle spring-boot

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

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

     @Autowired
     private TestEntityManager entityManager;

     @Autowired
     private VisitRepository visitRepository;

     ...
}
Run Code Online (Sandbox Code Playgroud)

当我尝试运行测试时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;
      ...
}
Run Code Online (Sandbox Code Playgroud)

如何管理?


编辑

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

@Service
public class DefaultConfigServiceImpl implements DefaultConfigService {

    private final DefaultConfigRepository defaultConfigRepository;

    @Autowired
    public DefaultConfigServiceImpl(final DefaultConfigRepository defaultConfigRepository) {
         this.defaultConfigRepository = defaultConfigRepository;
    }
}
Run Code Online (Sandbox Code Playgroud)

Ste*_*oll 43

问题是你@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 {
  ...
}
Run Code Online (Sandbox Code Playgroud)

  • 您的进口声明建议和解释是完美的!谢谢! (2认同)