2016-11-18 2 views
1

Я сделал свой собственный JUnit-Runner, реализовав org.junit.runner.Runner, чтобы я мог запускать свои UnitTests с ними, используя команду @RunWith -Annotation.Как правильно закрыть JUnit-Runner?

Это lookes примерно так:

public class MyRunner extends Runner { 

    private Context myContext; 
    myContext.init(); 
    private final BlockJUnit4ClassRunner runner; 

    public MyRunner(final Class<?> clazz) throws InitializationError { 
     myContext = new Context(); 

     runner = new BlockJUnit4ClassRunner(clazz); 
    } 

    @Override 
    public void run(final RunNotifier notifier) { 
     runner.run(notifier); 
    } 

    @Override 
    public Description getDescription() { 
     return runner.getDescription(); 
    } 

    public void filter(final Filter filter) throws NoTestsRemainException { 
     runner.filter(filter); 
    } 
} 

Для очистки ресурсов, я должен закрыть MyContext по телефону MyContext.close(). Где я должен ссылаться на это, чтобы мои ресурсы были очищены после того, как тесты были запущены?

ответ

-1

Где я должен ссылаться на это, чтобы мои ресурсы были очищены после тестов?

ОБНОВЛЕНО МОЙ ОТВЕТ, вы можете использовать org.junit.runner.notification.RunListener, как показано ниже:

(1) Создайте свой собственный класс RunListener:

public class MyRunnerListener extends RunListener { 
    private Context context; 

    public MyRunnerListener(Context context) { 
     this.context = context; 
    } 

    void testRunFinished(Result result) { 
      context.close(); 
    } 
} 

(2) Используйте MyRunnerListener внутри MyRunner:

public class MyRunner extends Runner { 

    private Context myContext; 
    MyRunnerListener runnerListener; 
    private final BlockJUnit4ClassRunner runner; 

    public MyRunner(final Class<?> clazz) throws InitializationError { 
     myContext = new Context(); 
     myContext.init(); 
     runnerListener = new MyRunnerListener(myContext); 

     runner = new BlockJUnit4ClassRunner(clazz); 
    } 

    @Override 
    public void run(final RunNotifier notifier) { 
     notifier.addListener(runnerListener); 
     runner.run(notifier); 
    } 

    @Override 
    public Description getDescription() { 
     return runner.getDescription(); 
    } 

    public void filter(final Filter filter) throws NoTestsRemainException { 
     runner.filter(filter); 
    } 
} 

P.S .: Если вы не хотите использовать Runner, вы можете выполнить ответ от Markus (который использует TestRule, NOT TestRunner).

+0

Это не дает ответа на вопрос, как это относится к классам под тест, но не бегун. – Bob

+0

Обновлен ответ, посмотрите на него – developer

+0

Это не сработает, потому что бегун может использоваться несколькими тестовыми классами. – Bob

1

Я не уверен, что вы пытаетесь для того чтобы достигнуть, но вы уже взглянули на JUnit's Rules?

public class MyContextRule extends ExternalResource { 

    private final Context myContext; 

    public MyContextRule() { 
     myContext = new Context(); 
    } 

    @Override 
    protected void before() throws Throwable { 
     myContext.init(); 
    } 

    @Override 
    protected void after() { 
     myContext.close(); 
    } 

} 

Использование:

public class MyTest { 
    @ClassRule 
    public static MyContextRule contextRule = new MyContextRule(); 

    //... 
} 

JUnit Rule сек преимущество над Runner с, что вы можете иметь несколько из них, в то время как вы только можете иметь один бегун.

Итак, ваш заказ Rule может быть использован с любым бегуном, которые могут быть введены случайным testframework, что вы можете столкнуться в будущем ...

Смежные вопросы