JpaTest를 수행 할 때 @SpringBootConfiguration을 찾을 수 없습니다 또는 @SpringBootTest (classes

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

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완전한 기능을 갖춘 구성 또한 발생 (혼합 웹, 데이터, 보안 등) 시험 슬라이스 기반 테스트가 실패합니다. 샘플 에서 테스트 샘플 을 확인하십시오 .