有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在执行JpaTest时找不到@SpringBootConfiguration

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

我正在尝试运行一个简单的Junit测试,看看我的CrudePositories是否真的有效

我经常遇到的错误是:

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

SpringBoot不是自己配置的吗

我的测试班:

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

    }
}

共 (6) 个答案

  1. # 1 楼答案

    在我的例子中,应用程序类和测试类的包是不同的

    package com.example.abc;
    ...
    @SpringBootApplication
    public class ProducerApplication {
    

    package com.example.abc_etc;
    ...
    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class ProducerApplicationTest {
    

    让他们同意后,测试运行正常

  2. # 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() {
        }
    }
    

    一切都应该正常。如果在src/main/com/example内创建一个名为app的新文件夹,然后将Application.java放在其中(并更新文件内的package声明),运行测试将出现以下错误:

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

  3. # 3 楼答案

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

    @SpringBootTest(classes = Application.class)
    

    JHipster项目here中的示例

  4. # 4 楼答案

    值得检查的是,您是否重构了用@SpringBootApplication注释的主类的包名。在这种情况下,testcase应该在一个合适的包中,否则它将在旧的包中查找它。我就是这样

  5. # 5 楼答案

    除了Thomas Kåsene所说的,您还可以添加

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

    如果您不想重构文件层次结构,请访问测试注释,以指定它应该在何处查找其他类。这就是错误消息的提示,它说:

    Unable to find a @SpringBootConfiguration, you need to use 
    @ContextConfiguration or @SpringBootTest(classes=...) ...
    
  6. # 6 楼答案

    这对我有用

    上述测试类的包名更改为与普通类的包名相同

    换成这个