Как написать generi c tearDown methd для junit? - PullRequest
1 голос
/ 04 марта 2020

В моем проекте (приложение весенней загрузки) у меня около 200+ тестовых случаев. Недавно мы реализовали один фабричный компонент для менеджера кэша (ehcache), который находится в моем классе запуска (@SpringBootApplication).

Моя проблема заключается в том, что, когда один класс запуска с этим фабричным компонентом выполняется одним тестовым случаем, все последующие тестовые сценарии завершаются с ошибкой ...

"Другой CacheManager с таким же имя 'appCacheManager' уже существует в той же виртуальной машине. "

Чтобы решить эту проблему, я добавил метод разборки с таким телом, как этот ...

public void tearDown() {
    MyCustomCacheManager customCacheManager = (MyCustomCacheManager) context.getBean("yourCustomCacheManagerBean");

    try {
        net.sf.ehcache.Cache cache = customCacheManager.getCache();
        net.sf.ehcache.CacheManager cacheManager = cache.getCacheManager();
        cacheManager.removeCache("nameOfYourCache");
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }

    context.destroy();
    context = null;
} 

По моей проблеме, я добавил этот метод разбора во всех существующих тестовых случаях.

Можем ли мы иметь что-то, что может быть реализовано, так что метод разрыва будет вызываться автоматически после каждого теста, мне не нужно добавлять разбор в каждый класс JUNIT ...

Может быть какой-то общий c разрыв с некоторой аннотацией в существующих тестовых случаях ...

Пожалуйста, совет .....

Ответы [ 3 ]

0 голосов
/ 04 марта 2020

Spring реализует это поведение, используя TestExecutionListener, и вы тоже можете.

Просто создайте файл src/main/resources/META-INF/spring.factories со следующим содержимым:

org.springframework.test.context.TestExecutionListener=\
com.yourpackage.CacheTestExecutionListener

... и реализуйте слушатель :

public class CacheTestExecutionListener implements TestExecutionListener {
    @Override
    public void afterTestMethod(TestContext testContext) throws Exception {
        // testContext.getApplicationContext().getBean(...)
    }
}

И это должно быть так - нет необходимости вносить изменения в существующие тесты.

0 голосов
/ 04 марта 2020

Похоже, вы используете Usain JUnit 4, но если вы используете 5, вы можете написать расширение , которое позволит вам аннотировать тестовые классы с его помощью, чтобы внедрить поведение.

0 голосов
/ 04 марта 2020

Я думаю о двух подходах для выполнения этого:

  1. Создайте базовый класс, который потребуется для расширения каждого модульного теста, и реализуйте метод tearDown ().
  2. Использование AOP (Аспектно-ориентированное программирование) для выполнения функциональности метода tearDown () после каждого метода в тестовом пакете.
...