2014-07-09 4 views
2

다음 코드를 단순화 할 방법을 찾고 있습니다.자바 주석 - 코드 단순화

@WebAppConfiguration 
@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes = { 
     // My configuration classes 
}) 
public class MyServiceTest { 
    @Autowired 
    private MyService service; 

    @Test 
    public void myTest() { 
     Assert.assertTrue(service != null); 
    } 
} 

많은 구성 클래스가 있으므로 각 테스트 클래스에 넣지 않으려 고합니다. 나는 다음과 같은 방법으로 그것을 사용하려고

@WebAppConfiguration 
@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes = { 
     // My configuration classes 
}) 
public @interface IntegrationTests { 
} 

: 그래서 난 내 자신의 주석을 만들 생각이있어

@IntegrationTests 
public class MyServiceTest { 
    @Autowired 
    private MyService service; 

    @Test 
    public void myTest() { 
     Assert.assertTrue(service != null); 
    } 
} 

을하지만 그것은 작동하지 않습니다. 어떤 생각?

+0

'봄을 나타낸다는 것이 맞습니까? – Thomas

+0

@ 토마스 : 예, 저는 봄을 사용합니다. – user3364391

+0

[봄의 커스텀 어노테이션에 관한 문서] (http://docs.spring.io/spring/docs/4.0.x/spring-framework-reference/)에서 알 수 있듯이'@ Target'과'@ Retention'을 추가 했습니까? html/cache.html # cache-annotation-stereotype)? – Thomas

답변

7

당신은 슈퍼 클래스에이 주석을 배치 할 수 있습니다 :

@WebAppConfiguration 
@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes = { 
     // My configuration classes 
}) 
public abstract class AbstractIntegrationTest { ... } 

합니다.

public class MyServiceTest extends AbstractIntegrationTest { ... } 

이 방법은 또한 기본 클래스에서 일반적으로 @Autowired 종속성을 선언하고 콘크리트 테스트에서 @ContextConfiguration 클래스를 정의 할 수 있습니다.

+0

그것은 작동합니다, 감사합니다 :) – user3364391

7

사용자 정의 이 구성된 주석이 작동하지 않는 이유는 JUnit이 @RunWith을 메타 주석으로 지원하지 않기 때문입니다. 따라서, 당신은 당신의 주석을 작성할 때 ...

@WebAppConfiguration 
@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes = { /* configuration classes */ }) 
public @interface IntegrationTests { 
} 

을 다음과 같이 ... 당신이 SpringJUnit4ClassRunner을 사용할 것을 볼 수 JUnit을입니다.

스프링 프레임 워크 4.0 이상은 메타 주석으로 사용 된 @WebAppConfiguration@ContextConfiguration의 선언을 보는 데 아무런 문제가 없어야합니다. 즉

, 다음이 당신을 위해 작동합니다 :

@WebAppConfiguration 
@ContextConfiguration(classes = { /* configuration classes */ }) 
@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.TYPE) 
public @interface IntegrationTests { 
} 

@RunWith(SpringJUnit4ClassRunner.class) 
@IntegrationTests 
public class MyServiceTest { 
    @Autowired 
    private MyService service; 

    @Test 
    public void myTest() { 
     assertNotNull(service); 
    } 
} 

을 대안으로 axtavt에서 권장하는대로 당신이 abstract 기본 테스트 클래스를 사용할 수 있습니다.

감사합니다,

샘 (스프링 TestContext 프레임 워크의 저자) Autowired` @