Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java @DataJpaTest需要测试之外的类_Java_Spring_Gradle_Spring Boot_Spring Test - Fatal编程技术网

Java @DataJpaTest需要测试之外的类

Java @DataJpaTest需要测试之外的类,java,spring,gradle,spring-boot,spring-test,Java,Spring,Gradle,Spring Boot,Spring Test,在SpringBoot应用程序中,我想对存储库层进行一些测试 @RunWith(SpringRunner.class) @DataJpaTest public class VisitRepositoryTest { @Autowired private TestEntityManager entityManager; @Autowired private VisitRepository visitRepository; ... } 当我尝

在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

所以这需要运行
应用程序

我试图将
DefaultConfigService
的bean放入
VisitePositionTest
中,但这是不允许的

这个类在我的应用程序中使用

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

      @Autowired
      private DefaultConfigService defaultConfigService;
      ...
}
如何管理


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


问题是您的
@springbootcomplication
有一些关于调度的额外配置,通过添加这些配置,并且您的测试没有自定义
@springbootcompliguration
,这样的调度要求对于所有测试都是强制性的

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

@SpringBootApplication
是一个
@SpringBootConfiguration
,因此如果您不做任何特殊操作,slice测试将使用您的应用程序作为配置源(这是IMO,一个优秀的默认设置)

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

在您的情况下,如果要使用切片,则调度配置应移动到
调度配置
或其他位置(不会像上面解释的那样使用切片进行扫描)。无论如何,我认为将
SchedulingConfigurer
实现分离出来更干净。如果这样做,您会注意到错误将消失

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

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

我不明白在测试运行期间,应用程序布线是如何成为一个问题的——根本不应该使用它。如果您试图直接通过应用程序类启动应用程序,则该错误是有意义的。您可以尝试在应用程序类中添加@ComponentScan(“com.norc”)吗?实际上,我只是尝试运行VisitePositionTest。。。用你的话。。。应用程序正在启动。。。我真的不明白为什么。。。但是您在测试中使用了
Jsr310JpaConverter
的workid?好的,我创建了另一个类,只用于调度。我使用配置和enablescheduling注释。但我真的不明白你所说的包保护配置是什么意思……这真的是一个细节。如果您愿意,您可以在代码中将调度配置设置为“私有内容”(
class SchedulingConfiguration
而不是
public class SchedulingConfiguration
)。它不会改变我的答案,而且完全无关,所以我将编辑并删除它。很抱歉造成混淆,
DataJpaTest
注释是否仅用于单元测试?那么,在一些集成测试中应该使用什么呢?测试切片应该只在单元测试中进行吗?您的导入语句建议和解释非常完美!非常感谢。回答得很好,非常感谢。如果您可以详细说明如果需要添加许多类,那么最好的方法是什么,那就更好了。应该创建自定义配置类吗?如何“导入”该配置上的许多类?我们应该如何“导入”该配置以应用于我们的测试?
@RunWith(SpringRunner.class)
@DataJpaTest
@Import(FooService.class)
public class VisitRepositoryTest {
  ...
}