복붙노트

[SPRING] JpaTest를 수행 할 때 @SpringBootConfiguration을 찾을 수 없습니다.

SPRING

JpaTest를 수행 할 때 @SpringBootConfiguration을 찾을 수 없습니다.

나는 프레임 워크에 익숙하지 않다. (그냥 클래스를 통과했다.) springboot를 처음 사용했다.

CrudRepositories가 실제로 작동하는지 확인하기 위해 간단한 Junit 테스트를 실행하려고합니다.

계속 오류가 있습니다.

봄 부팅 자체를 구성하지 않습니다?

내 테스트 클래스

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

 }

내 스프링 부팅 응용 프로그램 시작 프로그램

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

    }
}

미리 감사드립니다.

해결법

  1. ==============================

    1.사실, 스프링 부트는 대부분 자체적으로 설정됩니다. 아마도 이미 게시 한 많은 코드를 제거 할 수 있습니다. 특히 Application.

    사실, 스프링 부트는 대부분 자체적으로 설정됩니다. 아마도 이미 게시 한 많은 코드를 제거 할 수 있습니다. 특히 Application.

    모든 클래스의 패키지 이름을 포함 시키거나 최소한 Application 및 JpaTest의 패키지 이름을 포함했으면 좋겠습니다. @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를 안에 넣고 (파일 내부의 패키지 선언을 업데이트하면) 테스트를 실행하면 다음과 같은 오류가 발생합니다.

  2. ==============================

    2.구성은 응용 프로그램 클래스에 연결되므로 다음 사항을 모두 올바르게 설정합니다.

    구성은 응용 프로그램 클래스에 연결되므로 다음 사항을 모두 올바르게 설정합니다.

    @SpringBootTest(classes = Application.class)
    

    여기 JHipster 프로젝트의 예.

  3. ==============================

    3.@SpringBootApplication으로 주해 된 메인 클래스의 패키지 이름을 리팩터링했는지 확인하는 것이 가치가있다. 이 경우 테스트 케이스는 적절한 패키지에 있어야합니다. 그렇지 않으면 이전 패키지에서 테스트 케이스가 검색됩니다. 이것은 나를위한 경우였다.

    @SpringBootApplication으로 주해 된 메인 클래스의 패키지 이름을 리팩터링했는지 확인하는 것이 가치가있다. 이 경우 테스트 케이스는 적절한 패키지에 있어야합니다. 그렇지 않으면 이전 패키지에서 테스트 케이스가 검색됩니다. 이것은 나를위한 경우였다.

  4. ==============================

    4.Thomas Kåsene이 말한 것과 더불어,

    Thomas Kåsene이 말한 것과 더불어,

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

    테스트 주석에 파일 계층 구조를 리팩토링하지 않으려는 경우 다른 클래스를 찾아야하는 위치를 지정합니다. 다음과 같이 오류 메시지가 암시하는 내용입니다.

  5. ==============================

    5.Spring Boot 1.4에서 제공되는 테스트 슬라이스는 기능 지향 테스트 기능을 제공합니다.

    Spring Boot 1.4에서 제공되는 테스트 슬라이스는 기능 지향 테스트 기능을 제공합니다.

    예를 들어,

    @JsonTest는 json 직렬화 및 비 직렬화를 테스트하는 간단한 Jackson 환경을 제공합니다.

    @WebMvcTest는 모의 웹 환경을 제공하며 테스트 용 컨트롤러 클래스를 지정하고 테스트에 MockMvc를 삽입 할 수 있습니다.

    @WebMvcTest(PostController.class)
    public class PostControllerMvcTest{
    
        @Inject MockMvc mockMvc;
    
    }
    

    @DataJpaTest는 내장 데이터베이스를 준비하고 테스트를위한 기본 JPA 환경을 제공합니다.

    @RestClientTest는 테스트를위한 REST 클라이언트 환경을 제공하고, RestTemplateBuilder 등을 지원합니다.

    이러한 주석은 SpringBootTest로 구성되지 않으며 일련의 AutoconfigureXXX 및 @TypeExcludesFilter 주석과 결합됩니다.

    @DataJpaTest를 살펴보십시오.

    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Inherited
    @BootstrapWith(SpringBootTestContextBootstrapper.class)
    @OverrideAutoConfiguration(enabled = false)
    @TypeExcludeFilters(DataJpaTypeExcludeFilter.class)
    @Transactional
    @AutoConfigureCache
    @AutoConfigureDataJpa
    @AutoConfigureTestDatabase
    @AutoConfigureTestEntityManager
    @ImportAutoConfiguration
    public @interface DataJpaTest {}
    

    @AutoconfigureXXX 주석을 추가하여 기본 구성을 대체 할 수 있습니다.

    @AutoConfigureTestDatabase(replace=NONE)
    @DataJpaTest
    public class TestClass{
    }
    

    당신의 문제를 살펴 보겠습니다.

  6. ==============================

    6.이 문제를 해결하는 최선의 방법은 테스트 폴더 구조를 응용 프로그램 폴더 구조에 맞추는 것입니다.

    이 문제를 해결하는 최선의 방법은 테스트 폴더 구조를 응용 프로그램 폴더 구조에 맞추는 것입니다.

    내 프로젝트를 다른 폴더 구조 프로젝트에서 복제하여 발생하는 동일한 문제가 발생했습니다.

    테스트 프로젝트와 애플리케이션 프로젝트가 동일한 구조를 가지면 테스트 클래스에 특별한 주석을 추가 할 필요가 없으며 모든 것이 그대로 작동합니다.

  7. ==============================

    7.

    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
    import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureWebMvc;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.junit4.SpringRunner;
    
    
    
    @RunWith(SpringRunner.class)
    @DataJpaTest
    @SpringBootTest
    @AutoConfigureWebMvc
    public class RepoTest {
    
        @Autowired
        private ThingShiftDetailsRepository thingShiftDetailsRepo;
    
        @Test
        public void findThingShiftDetails() {
                ShiftDetails details = new ShiftDetails();
                details.setThingId(1);
    
                thingShiftDetailsRepo.save(details);
    
                ShiftDetails dbDetails = thingShiftDetailsRepo.findByThingId(1);
                System.out.println(dbDetails);
        }
    }
    

    위의 주석은 나를 위해 잘 작동했습니다. JPA에서 스프링 부트를 사용하고 있습니다.

  8. from https://stackoverflow.com/questions/39084491/unable-to-find-a-springbootconfiguration-when-doing-a-jpatest by cc-by-sa and MIT license