首页 > 解决方案 > @DataJpaTest - 从 @SpringBootApplication 类加载配置

问题描述

我有点困惑,基于这个文档,我应该只放这个注释@DataJpaTest,它会将我的应用程序上下文配置为仅适用于 JPA 存储库,也适用于内存数据库。现在问题出在我的应用程序中,我有一个带有注释的 Main 类,@SpringBootApplication它正在从那里加载 Web 拦截器的其余配置以及许多其他内容。事实上,它也在尝试加载 bootstrap.properties 文件。

据我了解,它不应该使用这种配置。

下面是我的测试代码和主类。

@OpenAPIDefinition(info = @Info(title = "Test API", version = "0.1.10-SNAPSHOT", description = "Test API", contact = @Contact(name = "My Team", email = "sample@mycompany.com")), servers = {
        @Server(description = "Current Stage Server url", url = "https://mycompany.com/testapics"),
        @Server(description = "Stable Stage Server url", url = "https://mycompany.com/testapi") })
@SpringBootApplication(scanBasePackages = { "com.mycompany.utility", "com.mycompany.sample.users",
        "com.mycompany.sample.utility", "com.mycompany.another.sample.interceptor",
        "com.mycompany.sample.security.vulnerableinput", "com.mycompany.sample.security.nocache.filter",
        "com.mycompany.sample.security.common", "com.mycompany.sample.security.csrf",
        "com.mycompany.sample.security.nocache" })
@EnableCaching
@EnableAsync
public class SampleApiApplication implements WebMvcConfigurer {

主类中有一堆其他的 bean 配置。(为了清楚起见,省略了这些)。

下面是我的测试课。

@DataJpaTest
public class UsersRepositoryTest {

    @Autowired
    private UsersRepository usersRepository;

    @Test
    public void test_usersRepository_findByEmplId() {
        List<User> users = getUsersData();
        UsersRepository.saveAll(users);
        for (User user : users) {
            Assert.assertTrue(user.getId() != null);
        }
    }

    private List<User> getUsersData() {
        List<User> userList = new ArrayList<>();
        User user = new User();
        user.setEmpId("XYZ_001");
        user.setUserUUID(UUID.randomUUID().toString());
        userList.add(user);
        return userList;
    }

}

标签: javaspringspring-bootunit-testingspring-data-jpa

解决方案


根据Spring Boot 参考

如果您使用测试注释来测试应用程序的更具体部分,则应避免在主方法的应用程序类上添加特定于特定区域的配置设置。

@SpringBootApplication定义了用于确保切片按预期工作的排除过滤器的底层组件扫描配置。如果您在 -annotated 类上使用显式@ComponentScan指令,请@SpringBootApplication注意这些过滤器将被禁用。如果您使用切片,则应重新定义它们。

因此,在您的情况下,请考虑将 , 之类的注释移动@EnableCaching@EnableAsync单独的类中。


推荐阅读