2011-11-22 4 views
3

유스 케이스가 간단합니다 : @Test 사용자 정의 주석 (@Mine이라고 부름)으로 주석이 지정된 JUnit 테스트의 각 메소드 앞에 보일러 플레이트 코드를 실행하고 싶습니다.@RunWith 또는 AOP를 사용하지 않고 각 JUnit @Test 메소드 앞에 코드를 개별적으로 실행하는 방법은 무엇입니까?

나는 다음과 같은 방법 (괄호 안의 설명) 사용하지 않으

:

  1. @RunWith을 (내 테스트는 이미이 주석을 사용하지 않을 수있다, 그래서 내가 할 수 있다고 가정 할 수 없다
  2. AOP (I는 AspectJ를 같은 타사 라이브러리) 나는이 ONL 반사와 나 잎 추측

에 대한 종속성을 만들 수 없습니다) 내 자신의 주자를 사용하는 y, 그것은 나에 의해 멋지다. @Before를 Thread.getCurrentThread() 등을 통해 현재의 메쏘드를 얻는 것과 함께 사용하는 것으로 생각했지만, 어쨌든이 방법은 보일러 플레이트 코드를 다시 반사시켜야하기 때문에이 솔루션이 조금 더러운 것입니다. 불필요한 코드는 피하는 것이 첫 번째 목표였습니다).

다른 아이디어가 있습니까?

+0

@Before를 사용할 수없는 이유를 모르겠습니다. –

+0

Test에서 주석이 달린 각 메서드 앞에 Before가 실행되기 때문에 Before. 내 예상되는 행동이 다릅니다. 내 사용자 지정 코드를 Mine 주석으로 표시된 메서드에서 실행하고 싶습니다. 다른 주석에 의존 할 수 없습니다. –

+0

@Before는 각각의 모든 메서드보다 먼저 실행됩니다. –

답변

9

TestRule을 기반으로하는 대답은 Mark unit test as an expected failure과 매우 비슷한 해결책이 필요합니다. @Deprecated 주석 (여기서 사용할 수 있습니다)의 예를 사용하면 주석이 메소드에 있으면 코드를 삽입 할 수 있습니다. Description 클래스는 메서드에 대한 주석 목록을 포함합니다.

public class ExecutionTest { 
    public class BeforeExecution implements TestRule { 
     public Statement apply(Statement base, Description description) { 
      return statement(base, description); 
     } 

     private Statement statement(final Statement base, final Description description) { 
      return new Statement() { 
       @Override 
       public void evaluate() throws Throwable { 
        if (description.getAnnotation(Deprecated.class) != null) { 
         // you can do whatever you like here. 
         System.err.println("this will be run when the method has an @Deprecated annotation"); 
        } 
        base.evaluate(); 
       } 
      }; 
     } 
    } 

    @Rule public BeforeExecution beforeExecution = new BeforeExecution(); 

    // Will have code executed. 
    @Deprecated 
    @Test public void test1() { 
     // stuff 
    } 

    // won't have code executed. 
    @Test public void test2() { 
     // stuff 
    } 
} 
+0

확인되었습니다. 이것은 예상대로 작동합니다. 내 마지막 해결책은 적절한 '@Rule'필드가있는 추상 클래스를 작성하는 것이 었습니다. 각 광산 테스트는이 클래스를 확장하므로 남은 유일한 것은 적절한 때마다 적절한 '@Mine'주석을 사용하는 것입니다. –

+0

내부 클래스를 정적으로 만드는 것, 즉'public static class BeforeExecution implements TestRule'? –

+0

@Mr_and_Mrs_D 아니요, 그렇지 않습니다. –

2

클래스를 두 개로 분할했습니다. 하나는 @mine으로 주석을 달았을 메소드이고 다른 하나는 주석으로 작성한 메소드입니다.

그런 다음 정상적으로 @before를 사용하십시오.

표준 코드가 없으므로 향후 개발자도 쉽게 이해하고 유지 관리 할 수 ​​있습니다.

관련 문제