2012-05-09 2 views
18

@PostConstruct 메서드가있는 클래스가있는 경우 JUnit 및 Spring을 사용하여 생성자와 @PostConstruct 메서드를 어떻게 테스트 할 수 있습니까? @PostConstruct 메서드가 실행되지 않아 Spring을 사용하지 않기 때문에 새로운 클래스 이름 (param, param)을 사용할 수 없습니다.Spring을 사용하여 @PostConstruct 메소드가있는 클래스의 생성자를 테스트하는 방법은 무엇입니까?

내가 여기에 뭔가 분명한 것을 놓치고 있습니까?

public class Connection { 

private String x1; 
private String x2; 

public Connection(String x1, String x2) { 
this.x1 = x1; 
this.x2 = x2; 
} 

@PostConstruct 
public void init() { 
x1 = "arf arf arf" 
} 

} 


@Test 
public void test() { 
Connection c = new Connection("dog", "ruff"); 
assertEquals("arf arf arf", c.getX1(); 
} 

이보다 약간 더 비슷하지만 @PostConstruct 메소드가 맞지 않습니다.

답변

11

Spring JUnit Runner을 살펴보십시오.

테스트 클래스에 클래스를 삽입하여 스프링이 클래스를 구성하고 포스트 생성 방법을 호출하도록해야합니다. 애완 동물 클리닉 예를 참조하십시오.

예 : 기본적으로

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = "classpath:your-test-context-xml.xml") 
public class SpringJunitTests { 

    @Autowired 
    private Connection c; 

    @Test 
    public void tests() { 
     assertEquals("arf arf arf", c.getX1(); 
    } 

    // ... 
+0

나는 그것이 진술했다는 것을 이해한다. 하지만 하나의 테스트 클래스 내에서이 생성자의 여러 순열을 테스트하려면 어떻게해야합니까? 내 질문에 대해 명확하지 않은 것은 무엇입니까? – AHungerArtist

+0

이 클래스의 생성자에 대해 5 개의 테스트 케이스가 필요하다. 정말 5 가지의 콩으로 앱 컨텍스트를 가지고로드하는 것보다 더 좋은 방법이 있습니까? – AHungerArtist

+0

실시간으로 클래스를 삽입 할 수있는 5 가지 방법이 있다면이 경우 5 가지 Bean 정의를 만들어야한다고 두려워합니다. –

0

@PostConstruct은 개체의 상태를 변경해야합니다. 그래서, JUnit 테스트 케이스에서, 빈을 얻은 후에 객체의 상태를 점검하십시오. @PostConstruct으로 설정된 상태와 같으면 테스트가 성공적으로 수행됩니다.

+0

문제는 어떻게 변경되었는지 테스트하는 것이 아니라 @PostConstruct가 해고되지 않는 것입니다. 내가 더 명확하게하기 위해 내 게시물을 편집합니다. – AHungerArtist

0

, 봄이 @PostConstruct와 @PreDestroy 주석을 인식하지 않습니다. 이를 가능하게하려면, 'CommonAnnotationBeanPostProcessor'를 등록하거나 bean 구성 파일에 ''를 지정해야합니다.

<bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor" />

또는

<context:annotation-config />

17

유일한 컨테이너 관리 Connection의 일부가 @PostContruct 방법의 경우, 단지 시험 방법에서 수동으로 호출

@Test 
public void test() { 
    Connection c = new Connection("dog", "ruff"); 
    c.init(); 
    assertEquals("arf arf arf", c.getX1()); 
} 

하는 경우가 의존성과 같은 것 이상입니다. 그래서 당신은 여전히 수동으로 또는 Sridhar가 말했듯이 스프링 테스트 프레임 워크를 사용하십시오.

+0

그게 내가 끝내 준거야. – AHungerArtist

+7

init은 private 일 수 있습니다. –

+0

@shanyangqu 그런 다음 예를 들어 ReflectionTestUtils 또는 이와 동등한 것을 사용할 수 있습니다. 시험 코드입니다. – mrembisz

관련 문제