当前位置: 首页 > 知识库问答 >
问题:

@datajpatest需要测试外部的类

王炜
2023-03-14

在一个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,但找不到该bean.

那么这需要运行应用程序吗?

我尝试在visitrepositorytest中放入defaultconfigservice的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个答案

於英朗
2023-03-14

问题是,您的@SpringBootApplication有一些关于调度的附加配置,通过添加这些配置,而不是为您的测试提供自定义的@SpringBootConfiguration,这样的调度要求对所有内容都是强制性的。

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

@SpringBootApplication是一个@SpringBootConfiguration所以如果您不做任何特殊的操作,切片测试将使用您的应用程序作为配置的源(这是IMO,一个出色的默认值)。

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

在您的情况下,如果希望使用切片,则调度配置应该移动到schedulingconfiguration或其他文件中(不会像上面解释的那样用切片扫描它)。无论如何,我认为分离schedulingconfigureer实现会更干净。如果您这样做,您会注意到错误将会消失。

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

@RunWith(SpringRunner.class)
@DataJpaTest
@Import(FooService.class)
public class VisitRepositoryTest {
  ...
}
 类似资料:
  • 我正在尝试使用以下方法设置一些Spring Boot JPA测试: 我有一个服务类: 和一个应用程序: 开始测试会出现错误: biz.ianw.coindatabase.Main中的字段dbService需要类型为“biz.ianw.coindatabase.database.CoinDbService”的bean,但找不到。 我认为,这与启动期间加载的bean@DataJpaTest的类型有关:

  • 它是@datajpatest或@mockmvc注释的模拟,可以与@runwith(Springrunner.class)结合使用,用于典型的DAO测试。使用此注释将禁用完全自动配置,而只应用与neo4j存储库测试相关的配置。

  • 问题内容: 因此,我确实看到了另一个问题:如何在指令UT中模拟所需的指令控制器,这基本上是我的问题,但似乎该线程的答案是“更改设计”。我想确保没有办法做到这一点。我有一个指令声明一个由子指令使用的控制器。我现在正尝试为children指令编写茉莉花测试,但由于它们依赖于控制器,因此我无法让它们在测试中进行编译。看起来是这样的: 子指令: 茉莉花测试: 我没有办法用茉莉花测试子指令吗?如果可以,我会

  • 我有一个简单的类,它将数据写入CSV文件: 我想知道如何测试这个类中包含的方法。我发现信息表明这可以通过使用Mockito来实现。是这样吗?我该怎么做呢?

  • 方法和测试位于一个类中,例如 下面是我的testng.xml的示例,其中包含了包含功能测试的包 UPD.post修改后的代码中包含AfterTest。我只使用before/aftermethod注释

  • 已删除MyTestConfig.class,但问题仍然相同。即使我使用@SpringBootTest(classes={Application.Class,MyProblematicServiceImpl.Class}),它仍然在自动连线的地方返回模拟对象。MyProblematicServiceImpl是用@Service注释的空类。