programing

JpaTest 실행 시 @SpringBootConfiguration을 찾을 수 없음

firstcheck 2022. 8. 1. 21:28
반응형

JpaTest 실행 시 @SpringBootConfiguration을 찾을 수 없음

프레임워크는 처음이고(클래스를 통과한 지 얼마 안 되어) Spring Boot을 처음 사용해 봅니다.

간단한 Junit 테스트를 실행하여 Crud Repository가 제대로 작동하는지 확인하려고 합니다.

계속 표시되는 오류는 다음과 같습니다.

@SpringBootConfiguration을 찾을 수 없습니다. @ContextConfiguration 또는 @SpringBootTest(classes=...)를 테스트 java.test와 함께 사용해야 합니다.Illogal State Exception(불법 상태 예외)

스프링 부트는 자동으로 설정되지 않습니까?

마이 테스트 클래스:

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

 }

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

    }
}

실제로 대부분의 경우 스프링 부트는 자체적으로 설정됩니다. 많은 이 삭제되어 있을 이 코드들은 이미 되어 있을 것입니다.★★★★★★★★★★★★★★★★★★,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);
    }
}

에 를뒤 of의 이 나옵니다.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 in file)을.

java.displaces를 클릭합니다.InlawalStateException:@SpringBootConfiguration을 찾을 수 없습니다. 테스트에서 @ContextConfiguration 또는 @SpringBootTest(classes=...)를 사용해야 합니다.

설정은 어플리케이션클래스에 첨부되어 있기 때문에, 다음의 순서로 모든 것이 올바르게 설정됩니다.

@SpringBootTest(classes = Application.class)

여기 JHipster 프로젝트의 예가 있습니다.

에 「」라고 있지 .@SpringBootApplication이 경우 테스트 케이스는 적절한 패키지에 담겨 있어야 합니다.그렇지 않으면 오래된 패키지에서 찾을 수 있습니다.이 경우는 저에게 해당됩니다.

토마스 코센이 말한 것 외에, 당신은 또한 다음을 추가할 수 있다.

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

파일 계층을 재팩터링하지 않으려면 다른 클래스를 검색해야 하는 위치를 지정하는 테스트 주석으로 이동합니다.에러 메세지가 나타내는 것은, 다음과 같습니다.

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

나는 효과가 있다.

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

이것으로 변경하다

내 경우 패키지가 응용 프로그램 클래스와 테스트 클래스가 달랐습니다.

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

그리고.

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

동의를 얻은 후 테스트가 올바르게 실행되었습니다.

도 같은 요.SpringBootApplicationsrc/test/folder의 루트 패키지에서

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

@SpringBootApplication
public class CoreTestConfiguration {}

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

예를들면,

@JsonTest는 Json의 시리얼화와 시리얼화를 테스트하기 위한 간단한 Jackson 환경을 제공합니다.

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

@WebMvcTest(PostController.class)
public class PostControllerMvcTest{

    @Inject MockMvc mockMvc;

}

@DataJpaTest는 임베디드 데이터베이스를 준비하고 테스트용 기본적인 JPA 환경을 제공합니다.

@RestClientTest는 테스트용 REST 클라이언트 환경(특히 RestTemplateBuilder 등)을 제공합니다.

.테스트, 그것들은 일련의 테스트와 조합됩니다.AutoconfigureXXX a. a. a.@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기능별로 할 수 예: ,음 into into into into into into into into 。WebConfig,DataJpaConfig기타. 풀기능 구성(웹, 데이터, 보안 등이 혼재)으로 인해 테스트 슬라이스 기반 테스트도 실패했습니다. 샘플에 있는 테스트 샘플을 확인합니다.

모든 클래스가 동일한 패키지에 포함되어 있을 때 테스트 클래스가 작동하고 있었습니다.적절한 프로젝트 구조를 유지하기 위해 모든 Java 클래스를 다른 패키지로 이동하자마자 동일한 오류가 발생하였습니다.

저는 아래와 같이 시험 시간에 제 메인 클래스 이름을 제공하여 해결했습니다.

@SpringBootTest(classes=JunitBasicsApplication.class)

에는 ★★★★★★★★★★★★★★★★★★★★★★.
(test package이름)을 확인합니다.YourApplicationTests는 (main package이름)에 해당합니다.

이 문제에 대한 최선의 해결책은 테스트 폴더 구조를 응용 프로그램 폴더 구조에 맞추는 것이라고 생각합니다.

다른 폴더 구조 프로젝트와 중복하여 동일한 문제가 발생하였습니다.

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

이것은 에러 그 자체이며, 원래의 질문에 대한 답변이 아닙니다.

Java 8 Java 11 、 Java 11 、 Java 11 java java java java java 。 프로그램이 컴파일되었지만 했습니다.Unable to find a @SpringBootConfigurationmaven을 사용하여 명령줄에서 실행했을 때 통합 테스트에 나타나기 시작했습니다(IntelliJ에서는 동작했습니다).

maven-failsafe-plugin클래스 패스의 클래스가 표시되지 않게 되어, Failsafe 플러그인에 수동으로 클래스를 포함하도록 지시하는 것으로, 이 문제를 해결했습니다.

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-failsafe-plugin</artifactId>
            <configuration>
                <additionalClasspathElements>
                    <additionalClasspathElement>${basedir}/target/classes</additionalClasspathElement>
                </additionalClasspathElements>
            </configuration>
            ...
        </plugin>

교체했을 import org.junit.Test;import와 org.junit.jupiter.api.Test;효과가 있었어요

테스트 클래스가 메인 스프링 부트 클래스의 하위 패키지에 포함되어 있는지 확인하십시오.

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에서 스프링 부츠를 사용하고 있습니다.

언급URL : https://stackoverflow.com/questions/39084491/unable-to-find-a-springbootconfiguration-when-doing-a-jpatest

반응형