执行JpaTest时无法find@SpringBootConfiguration

我是新来的框架(只是通过类),这是我第一次使用springboot。

我试图运行一个简单的Junittesting,看看我的CrudRepositories是否确实工作。

我不断收到的错误是:

无法find@SpringBootConfiguration,您需要使用@ContextConfiguration或@SpringBootTest(classes = …)与您的testingjava.lang.IllegalStateException

不是春季开机configuration本身?

我的testing课

@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启动应用程序启动器

 @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); } } 

提前致谢

事实上,Spring Boot确实为自己设定了大部分。 你可能已经摆脱了你发布的很多代码,特别是在Application

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

例如,如果您的testing类的完全限定名称是com.example.test.JpaTest ,而您的应用程序的名称是com.example.Application ,则testing类将能够find@SpringBootApplication (以及其中的@SpringBootConfiguration )。

但是,如果应用程序驻留在包层次结构的另一个分支中,就像com.example.application.Application一样,它不会find它。

考虑下面的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() { } } 

一切都应该工作。 如果你在src/main/com/example里面创build了一个名为app的新文件夹,然后把你的Application.java放在里面(并且更新文件里面的package声明),运行testing会出现如下错误:

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

configuration被附加到应用程序类,所以下面将正确设置一切:

 @SpringBootTest(classes = Application.class) 

来自JHipster项目的例子。

除了ThomasKåsene所说的,你还可以添加

 @SpringBootTest(classes=com.package.path.class) 

如果你不想重构你的文件层次结构,就可以指定testing注释来指定其他类的位置。 这就是错误信息所暗示的:

 Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest(classes=...) ... 

值得一提的是,如果你使用@SpringBootApplication注解了你的主类的重构包名,在这种情况下,testing用例应该放在合适的包中,否则它将在旧包中查找它。 这是我的情况。