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

나는 프레임 워크를 처음 접했고 (방금 수업을 통과했다) 스프링 부트를 사용한 것은 이번이 처음이다.

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

내가 계속 얻는 오류는 다음과 같습니다.

@SpringBootConfiguration을 찾을 수 없으면 테스트 java.lang.IllegalStateException과 함께 @ContextConfiguration 또는 @SpringBootTest (classes = …)를 사용해야합니다.

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

 }

내 스프링 부트 애플리케이션 스타터 :

@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.

모든 클래스의 패키지 이름 또는 적어도 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내부 를 넣고 package파일 내부에서 선언을 업데이트 하면 테스트를 실행하면 다음 오류가 발생합니다.

java.lang.IllegalStateException : @SpringBootConfiguration을 찾을 수 없습니다. 테스트와 함께 @ContextConfiguration 또는 @SpringBootTest (classes = …)를 사용해야합니다.


답변

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

@SpringBootTest(classes = Application.class)

JHipster 프로젝트의 예제는 여기에 있습니다 .


답변

주석이 달린 메인 클래스의 패키지 이름을 리팩토링했는지 확인하는 것이 좋습니다 @SpringBootApplication. 이 경우 테스트 케이스는 적절한 패키지에 있어야하며, 그렇지 않으면 이전 패키지에서 찾을 것입니다. 이것은 나를위한 경우였다.


답변

Thomas Kåsene이 말한 것 외에도

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

파일 계층을 리팩토링하지 않으려는 경우 테스트 주석에 다른 클래스를 찾아야 할 위치를 지정하십시오. 이것은 다음과 같이 말함으로써 오류 메시지가 암시하는 것입니다.

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

답변

제 경우에는 패키지가 Application 클래스와 Test 클래스 사이에 달랐습니다

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

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

그것들을 테스트 한 후 테스트가 올바르게 실행되었다는 데 동의했습니다.


답변

그것은 나를 위해 작동

위 테스트 클래스의 패키지 이름이 일반 클래스의 패키지 이름과 동일하게 변경되었습니다.

이것으로 변경


답변

테스트 조각 봄 부팅 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{
}

문제를 살펴 보자.

  1. 혼합하지 마십시오 @DataJpaTest@SpringBootTest위의 말했듯이, @DataJpaTest자신의 방식으로 구성을 구축 할 것입니다 응용 프로그램 구성 상속에서 (예. 기본적으로는 임베디드 H2 대신을 준비하려고합니다). 테스트 슬라이스@DataJpaTest 로 지정됩니다 .
  2. 당신의 구성을 사용자 정의하려면 @DataJpaTest참조하시기 바랍니다 이 공식 블로그 항목 이 주제에 대한 Spring.io에서, (조금 지루한을).
  3. 의 구성을 분할 Application과 같은 기능으로 작은 구성으로 WebConfig, DataJpaConfig완전한 기능을 갖춘 구성 또한 발생 (혼합 웹, 데이터, 보안 등) 시험 슬라이스 기반 테스트가 실패합니다. 샘플 에서 테스트 샘플 을 확인하십시오 .