2009-10-14 6 views
3

다음 테스트는이 테스트 빈이 Spring에 의해 두 번 초기화됨을 보여줍니다. 나는 누군가가 나에게 이유가 무엇인지 말할 수 있기를 바라고있다.SpringJUnit4ClassRunner는 각 테스트에 대해 beans를 초기화합니까?

import org.apache.log4j.Logger; 
import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.springframework.beans.factory.InitializingBean; 
import org.springframework.test.context.ContextConfiguration; 
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 


@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = {}) 
public class TestAfterPropsSet implements InitializingBean { 

private static final Logger logger = Logger.getLogger(TestAfterPropsSet.class); 

@Test 
public void test1() { 
    logger.debug("Test1"); 
} 

@Test 
public void test2() { 
    logger.debug("Test2");  
} 

public void afterPropertiesSet() throws Exception { 
    logger.debug("Bean Initialized");  
} 
} // end class 

다음은 빈 파일입니다 :

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation=" 
     http://www.springframework.org/schema/beans 
      http://www.springframework.org/schema/beans/spring-beans.xsd"> 
</beans> 

을 여기에 출력입니다 : 여기에 테스트입니다

2009-10-13 21:20:04,393 [TestAfterPropsSet.java 26] DEBUG - Bean Initialized 
2009-10-13 21:20:04,393 [TestAfterPropsSet.java 17] DEBUG - Test1 
2009-10-13 21:20:04,393 [TestAfterPropsSet.java 26] DEBUG - Bean Initialized 
2009-10-13 21:20:04,393 [TestAfterPropsSet.java 22] DEBUG - Test2 

답변

8

그것은 아닌 봄 대회입니다. JUnit 규칙을 따라야합니다. 즉, Suite 전체 초기화 또는 해체가 @BeforeClass 및 @AfterClass에서 수행되어야합니다. 그렇지 않으면 @Autowire를 사용하고 Spring이 객체의 범위를 처리하도록 할 수 있습니다.

각 테스트마다 새로운 제품군이 구성됩니다. 이것은 JUnit3에서 더 명확합니다. 여기서 지정된 테스트 이름을 사용하여 새 제품군을 만들어야했습니다.

JavaDoc에서보세요 :

테스트 주석이이 테스트 케이스로 실행할 수 있습니다 부착되어있는 공공 무효의 방법을 JUnit을 알려줍니다. 메소드를 실행하면 JUnit은 먼저 클래스의 새로운 인스턴스를 구성하고 은 주석 된 메소드를 호출합니다. 테스트에서 throw 된 예외는 JUnit에 의해보고 된 이됩니다. 예외가 발생하지 않으면 테스트는 성공한 것으로 가정합니다 ( ).

테스트는 실제로 아무것도 수행하지 않고 참조하는 빈이 없기 때문에 유스 케이스가 약간 당황합니다. 기본적으로 스프링 bean은 기본 scope = "singleton"속성으로 선언되므로 실제로 bean을 선언했다면 캐시 된 싱글 톤이었을 것입니다. 그러나 이것은 메소드 실행과는 아무런 관련이 없습니다.

+0

고지 : "implements InitializingBean"은 bean이됩니다. 적어도 나는 이름으로 생각한다. 그리고 내가 필드와 그곳에 그것을 들려 줄 수 있다는 사실. @BeforeClass의 문제점은 Spring이 테스트 클래스에 주입하기 전에 실행된다는 것이다. 테스트 리소스를 주입하기 때문에 종종 문제가됩니다. @Before와 같은 것도 주사 전에 실행되지만 모든 테스트마다 실행됩니다. 내가 찾은 최선의 방법은 InitiliazingBean 인터페이스의 afterPropertiesSet()을 사용하고 거기에 자원을 주입하는 데 필요한 모든 설정을 수행하는 것입니다. 내가 발견 한 문제는 각 테스트 전에 afterPropertiesSet이 실행된다는 점입니다. – harschware

+0

그건 좀 더 의미가 있습니다. 형식을 포함하도록 편집되기 전에 나머지 코드를 잡아 내지 못했습니다. lazy-init = "true"를 사용하여 Spring을 BeanFactory를 사용하여 @BeforeClass 또는 @Before에서 요청시 인스턴스화 할 수 있다고 확신하지만 다시 초기화하지는 않습니다. 어쩌면 이것은 제 생각이지만, 코드 제약이 없으면 다시 초기화 할 때 문제가 있다고 생각하지 않습니다. – Droo

+0

내 의견에 대한 정정 : "@bfore와 같은 것도 주사하기 전에 실행"이 사실이 아닙니다. 나는이 문제로 많은 변화가 있다고 생각하지 않습니다. – harschware

관련 문제