无法找到使用@DataJpaTest的@SpringBootConfiguration

2023/05/11

1. 简介

在我们的Spring Boot测试教程中,我们看到了如何使用@DataJpaTest注解。

在本教程中,我们将了解如何解决错误“无法找到@SpringBootConfiguration”

2. 原因

@DataJpaTest注解帮助我们设置JPA测试,为此,它初始化应用程序,忽略不相关的部分。例如,它会忽略MVC控制器。

但是,要初始化应用程序,它需要配置。

为此,它会在当前包中搜索并在包层次结构中向上搜索,直到找到配置。

例如,让我们在cn.tuyucheng.taketoday.data.jpa包中添加一个@DataJpaTest,然后,它将在以下位置搜索配置类:

  • cn.tuyucheng.taketoday.data.jpa
  • cn.tuyucheng.taketoday.data
  • 等等

但是,当没有找到配置时,应用程序会报错:

Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest(classes=...) with your test java.lang.IllegalStateException

例如,发生这种情况可能是因为配置类位于更具体的包中,例如cn.tuyucheng.taketoday.data.jpa.application。如果我们将配置类移动到cn.tuyucheng.taketoday.data.jpa,Spring现在能够找到它

另一方面,我们可以有一个没有任何@SpringBootConfiguration的模块。在下一节中,我们将研究这种情况。

3. 缺少@SpringBootConfiguration

如果我们的模块不包含任何@SpringBootConfiguration怎么办?这可能有多种原因。让我们假设,对于本教程,我们有一个仅包含模型类的模块。

因此,解决方案很简单,让我们在测试代码中添加一个@SpringBootApplication:

@SpringBootApplication
public class TestApplication {}

现在我们有了一个带注解的类,Spring能够引导我们的测试。

为了验证我们的设置,我们注入一个TestEntityManager并验证它是否已设置:

@ExtendWith(SpringExtension.class)
@DataJpaTest
class DataJpaUnitTest {

    @Autowired
    private TestEntityManager entityManager;

    @Test
    void givenACorrectSetup_thenAnEntityManagerWillBeAvailable() {
        assertNotNull(entityManager);
    }
}

当Spring可以在其自己的包或其父包之一中找到@SpringBootConfiguration时,此测试成功

4. 总结

在这个简短的教程中,我们介绍了错误的两个不同原因:“无法找到@SpringBootConfiguration”。

首先,我们了解了找不到配置类的情况,这是因为它的位置所导致的,我们通过将配置类移动到另一个位置来解决它。

其次,我们介绍了没有配置类可用的场景,这是通过向我们的测试代码库添加@SpringBootApplication来解决这个问题。

与往常一样,本教程的完整源代码可在GitHub上获得。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章