나는 프레임 워크를 처음 접했고 (방금 수업을 통과했다) 스프링 부트를 사용한 것은 이번이 처음이다.
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{
}
문제를 살펴 보자.
- 혼합하지 마십시오
@DataJpaTest
과@SpringBootTest
위의 말했듯이,@DataJpaTest
자신의 방식으로 구성을 구축 할 것입니다 응용 프로그램 구성 상속에서 (예. 기본적으로는 임베디드 H2 대신을 준비하려고합니다). 테스트 슬라이스@DataJpaTest
로 지정됩니다 . - 당신의 구성을 사용자 정의하려면
@DataJpaTest
참조하시기 바랍니다 이 공식 블로그 항목 이 주제에 대한 Spring.io에서, (조금 지루한을). - 의 구성을 분할
Application
과 같은 기능으로 작은 구성으로WebConfig
,DataJpaConfig
등 완전한 기능을 갖춘 구성 또한 발생 (혼합 웹, 데이터, 보안 등) 시험 슬라이스 기반 테스트가 실패합니다. 내 샘플 에서 테스트 샘플 을 확인하십시오 .