执行 JpaTest 时找不到 @SpringBootConfiguration

新手上路,请多包涵

我是框架新手(刚刚通过了课程),这是我第一次使用 Spring Boot。

我正在尝试运行一个简单的 Junit 测试,以查看我的 CrudRepositories 是否确实有效。

我不断收到的错误是:

无法找到 @SpringBootConfiguration,您需要使用 @ContextConfiguration 或 @SpringBootTest(classes=…) 与您的测试 java.lang.IllegalStateException

Spring Boot 不会自行配置吗?

我的测试班:

 @RunWith(SpringRunner.class)
@DataJpaTest
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
public class JpaTest {

@Autowired
private AccountRepository repository;

@After
public void clearDb(){
    repository.deleteAll();
}

 @Test
 public void createAccount(){
     long id = 12;
     Account u = new Account(id,"Tim Viz");
     repository.save(u);

     assertEquals(repository.findOne(id),u);

 }

 @Test
 public void findAccountByUsername(){
     long id = 12;
     String username = "Tim Viz";
     Account u = new Account(id,username);
     repository.save(u);

     assertEquals(repository.findByUsername(username),u);

 }

我的 Spring Boot 应用程序启动器:

 @SpringBootApplication
@EnableJpaRepositories(basePackages = {"domain.repositories"})
@ComponentScan(basePackages = {"controllers","domain"})
@EnableWebMvc
@PropertySources(value    {@PropertySource("classpath:application.properties")})
    @EntityScan(basePackages={"domain"})
    public class Application extends SpringBootServletInitializer {
        public static void main(String[] args) {
            ApplicationContext ctx = SpringApplication.run(Application.class, args);

        }
    }

我的仓库:

 public interface AccountRepository extends CrudRepository<Account,Long> {

    public Account findByUsername(String username);

    }
}

原文由 Thomas Billet 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 537
2 个回答

事实上,Spring Boot 确实在很大程度上设置了自己。您可能已经删除了很多您发布的代码,尤其是在 Application 中。

我希望你已经包含了所有类的包名,或者至少包含 ApplicationJpaTest 的包名。关于 @DataJpaTest 和其他一些注释的事情是他们在当前包中寻找 @SpringBootConfiguration 注释,如果他们在那里找不到它,他们会遍历包层次结构,直到找到它。

例如,如果您的测试类的完全限定名称是 com.example.test.JpaTest 并且您的应用程序的名称是 com.example.Application ,那么您的测试类将能够找到 @SpringBootApplication (以及其中的 @SpringBootConfiguration )。

但是,如果应用程序位于包层次结构的不同分支中,例如 com.example.application.Application ,它将 找不到 它。

例子

考虑以下 Maven 项目:

 my-test-project
  +--pom.xml
  +--src
    +--main
      +--com
        +--example
          +--Application.java
    +--test
      +--com
        +--example
          +--test
            +--JpaTest.java

然后 Application.java 中的以下内容:

 package com.example;

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

后面是 JpaTest.java 的内容:

 package com.example.test;

@RunWith(SpringRunner.class)
@DataJpaTest
public class JpaTest {

    @Test
    public void testDummy() {
    }
}

一切都应该正常工作。 If you create a new folder inside src/main/com/example called app , and then put your Application.java inside it (and update the package declaration inside the文件),运行测试会给你以下错误:

java.lang.IllegalStateException:无法找到@SpringBootConfiguration,您需要在测试中使用@ContextConfiguration 或@SpringBootTest(classes=…)

原文由 Thomas Kåsene 发布,翻译遵循 CC BY-SA 3.0 许可协议

配置附加到应用程序类,因此以下内容将正确设置所有内容:

 @SpringBootTest(classes = Application.class)

来自 JHipster 项目的例子 在这里

原文由 mrts 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题