복붙노트

[SPRING] 스프링 테스트 및 메이븐

SPRING

스프링 테스트 및 메이븐

내 Spring 웹 애플리케이션을 테스트하려고하는데 문제가있다.

나는 내 maven에 테스트 클래스를 추가했다.

@RunWith( SpringJUnit4ClassRunner.class )
@ContextConfiguration
public class UserServiceTest {

    @Autowired
    private UserService userService;

    @Test
    public void testName() throws Exception {
        List<UserEntity> userEntities = userService.getAllUsers();

        Assert.assertNotNull(userEntities);
    }
}

하지만이 테스트를 실행하려고하면 userService에 NullPointerException이 발생합니다. IntelliJ는 "autowire를 사용할 수 없습니다. 'UserService'유형의 빈을 찾지 못했습니다. @RunWith (SpringJUnit4ClassRunner.class)를 추가 한 후에이 예외가 발생했습니다.

java.lang.IllegalStateException: Neither GenericXmlContextLoader nor AnnotationConfigContextLoader was able to detect defaults, and no ApplicationContextInitializers were declared for context configuration

어떻게 해결할 수 있습니까? 그리고 나는 내 tomcat 서버에서이 테스트를 실행해야한다고 생각하지만 IntelliJ로 테스트하기 위해 어떻게 배포 할 수 있습니까? ( 'mvn clean install tomcat7 : run-war-only'명령과 유사)

해결법

  1. ==============================

    1.테스트를 시작하기 전에 초기화 할 Spring 컨텍스트 파일의 위치를 ​​제공해야한다.

    테스트를 시작하기 전에 초기화 할 Spring 컨텍스트 파일의 위치를 ​​제공해야한다.

    테스트 클래스

    @RunWith( SpringJUnit4ClassRunner.class )
    @ContextConfiguration(locations = { "classpath:META-INF/your-spring-context.xml" })
    public class UserServiceTest extends AbstractJUnit4SpringContextTests {
    
        @Autowired
        private UserService userService;
    
        @Test
        public void testName() throws Exception {
            List<UserEntity> userEntities = userService.getAllUsers();
    
            Assert.assertNotNull(userEntities);
        }
    }
    

    your-spring-context.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xmlns:p="http://www.springframework.org/schema/p"
        xmlns:context="http://www.springframework.org/schema/context" 
        xmlns:tx="http://www.springframework.org/schema/tx" 
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
    
        <bean id="userService" class="java.package.UserServiceImpl"/>
    
    </beans>
    
  2. ==============================

    2.테스트를 통해 달성하고자하는 것에 따라 단위 테스트 또는 Spring 통합 테스트를 작성해야합니다.

    테스트를 통해 달성하고자하는 것에 따라 단위 테스트 또는 Spring 통합 테스트를 작성해야합니다.

    후자의 경우 코드를 다음과 같이 변경해야합니다.

    @ContextConfiguration(locations = {"classpath:/applicationContext.xml"})
    @RunWith(SpringJUnit4ClassRunner.class)
    public class UserServiceTest {
    
       @Autowired
       private UserService userService;
    
        //test whatever
    }
    

    이러한 통합 테스트를 수행 할 때 Spring Profile 메커니즘에 연결하고 싶을 것이다. 이를 활용하면 프로덕션 코드에서 사용하는 것과 동일한 구성을 재사용하면서 특정 빈을 선택적으로 대체 할 수 있습니다 (예 : 프로덕션 데이터 원본을 메모리 내 데이터베이스로 교체).

    Spring 4를 사용한다면, Conditional은 더 많은 유연성을 줄 것이다.

    Spring 통합 테스트가 여러분을 위해 무엇을 할 수 있는지에 대한 개요를 얻기 위해 Spring 테스트 문서의이 부분에 좋은 정보를 제공하시기 바랍니다.

    당신이 제시 한 경우 나는 통합 테스트를 위해 자신을 보증하지는 않는다. (UserService가 실제로하는 것이 더 명확한 그림을 제공 할 것이다.)

    예를 들어, UserService가 UserDao를 사용하고 dao의 결과에 대해 일부 사용자 지정 논리를 수행하는 경우, 조롱 한 UserDao로 UserService에 대한 단위 테스트를 만드는 것이 좋은 옵션입니다.

    dao를 서비스에 제공하기 위해 생성자 주입을 사용하는 경우 서비스의 구성은 간단합니다. @Autowired를 통해 필드 주입을 사용하는 경우 (이를 피할 수 있으면 안됩니다), 리플렉션을 통해 모의를 삽입해야합니다. 이를위한 슈퍼 유틸리티는 Spring의 ReflectionTestUtils입니다.

    그런 다음 데이터베이스에서 데이터를 올바르게 읽을 수 있는지 테스트하는 UserDao에 대한 통합 테스트를 만들 수 있습니다.

    마지막으로 위의 주석은 테스트 실행 방법 (IDE 또는 Maven)과 관계가 없다는 점에 유의하십시오. 제대로 구성되어 있으면 도구로 문제가 해결됩니다.

  3. ==============================

    3.확실하지는 않지만, Bean이 모두있는 xml 파일을 지정할 수있는 ContextConfiguration 주석에 locations 속성을 추가해야한다고 생각합니다. 또한 모든 사용자를 가져 오는 작업은 데이터베이스와 관련되어 있으므로 TransactionConfiguration 주석을 추가하는 것이 좋습니다. 따라서 다음과 같은 내용이 있어야합니다.

    확실하지는 않지만, Bean이 모두있는 xml 파일을 지정할 수있는 ContextConfiguration 주석에 locations 속성을 추가해야한다고 생각합니다. 또한 모든 사용자를 가져 오는 작업은 데이터베이스와 관련되어 있으므로 TransactionConfiguration 주석을 추가하는 것이 좋습니다. 따라서 다음과 같은 내용이 있어야합니다.

  4. from https://stackoverflow.com/questions/26055876/spring-testing-and-maven by cc-by-sa and MIT license