在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;
}
}
答案 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 {
...
}