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


185

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

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

    }
}

답변:


264

실제로 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 = ...)를 사용해야합니다.


1
감사합니다. Maven 패킷 설정을 사용하여 테스트 및 애플리케이션 코드를위한 다른 패키지와 함께 솔루션을 제공해 주셔서 감사합니다. 내가 무슨 말을하고 있는지 올바르게 해석하면 테스트 패키지를 Application 클래스로 보내야합니까? 그런 다음 SpringConfiguration을 찾을 수 있습니까?
Thomas Billet

"maven packet"이 "module"을 의미하는 경우, 예, 테스트 클래스가있는 모듈이있는 모듈에 의존해야합니다 Application. 그러나 src/mainand 를 의미 src/test하는 경우 해당 폴더는 패키지의 일부가 아닙니다. 계층. 스크린 샷이나 프로젝트 구조에 대한 설명으로 질문을 업데이트하는 것이 좋습니다.
Thomas Kåsene

당신이 말한대로 문제를 해결했습니다. 인터넷 검색 후 제안 된 스프링 패킷 구조를 발견하고 모두 리팩토링했습니다. 이제 테스트가 예상대로 실행됩니다. 고마워요
토마스 빌렛

알았어요 어쨌든 더 철저한 예제로 답변을 업데이트했습니다.
Thomas Kåsene

3
+-test +-com +-example +-JpaTest.java도 작동
user674158

105

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

@SpringBootTest(classes = Application.class)

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


이것은 완벽한 솔루션 인 것 같습니다. 수업이나 폴더를 옮길 필요가 없습니다.
Abhishek Aggarwal

21

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


11

Thomas Kåsene이 말한 것 외에도

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

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

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

이것은 매우 귀중한 답변입니다! @cameron 감사합니다!
랜스 종류

6

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

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

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

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


5

그것은 나를 위해 작동

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

이것으로 변경


3

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

1

이 문제에 대한 가장 좋은 해결책은 테스트 폴더 구조를 응용 프로그램 폴더 구조에 맞추는 것입니다.

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

테스트 프로젝트와 응용 프로그램 프로젝트의 구조가 동일한 경우 테스트 클래스에 특수 주석을 추가 할 필요가 없으며 모든 것이 그대로 작동합니다.


나는 같은 오류가 있었고 마침내 테스트 클래스의 패키지 이름에 "rules"대신 오타 "rule"이 있다는 것을 알았습니다. 패키지 이름을 수정 한 후 오류가 사라졌습니다.
Gopal Bairwa

1

모든 클래스가 동일한 패키지에 있으면 테스트 클래스가 작동했습니다. 적절한 프로젝트 구조를 유지하기 위해 모든 Java 클래스를 다른 패키지로 이동하자마자 동일한 오류가 발생했습니다.

아래와 같이 테스트 클래스에서 기본 클래스 이름을 제공하여 해결했습니다.

@SpringBootTest(classes=JunitBasicsApplication.class)

1

똑같은 문제가 있었고 SpringBootApplication폴더 src / test / java 의 루트 패키지에 주석이 달린 빈 클래스를 추가하여 해결했습니다.

package org.enricogiurin.core;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class CoreTestConfiguration {}

0

내 경우에
있는지 확인 ( test package이름 )으로는 YourApplicationTests제 (에 해당 main package이름 ).


-2
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와 함께 스프링 부트를 사용하고 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.