Минимизация удержания объекта во время юнит-тестов - PullRequest
1 голос
/ 17 января 2011

У меня есть вопрос об управлении памятью / утечках памяти, который я хотел бы уточнить.

Настройка:

Я тестирую некоторый код сервлета, который принимает ссылки на объекты HttpServletRequest и HttpResponse HttpServletRequest #getParameter (String), HttpServletRequest # getHeader (String) и HttpServletRequest # getAttribute (String).

Я пишу модульные тесты для кода сервлета.Чтобы разрешить тестирование, я создал заглушки для HttpServletRequest и HttpServletResponse, которые позволят проводить тестирование.Пример кода приведен ниже:

public final class HttpServletRequestStub implements HttpServletRequest {

  private Map<String, String> parameterMap = new HashMap<String, String>();
  private Map<String, String> headerMap = new HashMap<String, String>();
  private Map<String, String> attributeMap = new HashMap<String, String>();

  public void setParameter(String param, String value) {
    this.parameterMap.put(param, value);
  }
  public void setHeader(String param, String value) {
    this.headerMap.put(param, value);
  }
  @Override
  public void setAttribute(String param, String value) {
    this.attributeMap.put(param, value);
  }
  public void flush() {
     this.parameterMap.clear();
     this.headerMap.clear();
     this.attributeMap.clear();
  }

  @Override
  public String getParameter (String parameter) {
    return this.parameterMap.get(parameter);
  }
  @Override
  public String getHeader(String parameter) {
    return this.headerMap.get(parameter);
  }
  @Override
  public String getAttribute(String attribute) {
    return this.attributeMap.get(attribute);
  }

   .... Other stubbed methods




}

В моем модульном тесте:

public class MyTest {
   private MyServlet servlet;

   private HttpServletRequest request;

   private HttpServletResponse response;

   @Before
   public void setUp() throws Exception {
      request = new HttpServletRequestStub();
      response = new HttpServletResponseStub(); // Not in the sample code but implemented.
      servlet = new MyServlet();
   }

   @After
   public void tearDown() throws Exception {
      request = null;
      response = null;
      servlet = null;
   }

  @Test
  public void testFoo() throws Exception {
     request.setParameter("foo", "bar");
     request.setAttribute("attrib", "attrib");
     request.setHeader("header", "header");
     servlet.service(request, response);
  }


}

Мой вопрос касается управления памятью.Необходимо ли мне очищать поддельный заголовок, содержимое карты запроса и атрибута после выполнения теста или это произойдет автоматически после того, как запрос, объекты ответа разыменовываются в моем методе разрыва (аннотированном @After)?Должен ли я вызывать метод flush явно в моем методе tear down, чтобы очистить ссылки на память?Я подумал, что мне может понадобиться настроить слабые ссылки для карт-заглушек, используя Weak HashMap вместо HashMap, но я не знаю, правильный ли это выбор.Я прочитал эту статью и до сих пор не ясно.Любая помощь будет полезна.

Спасибо,

Kartik

Ответы [ 2 ]

1 голос
/ 17 января 2011

Разыменования объекта должно быть достаточно.Java сборщик мусора удаляет все объекты, к которым нет доступа, то есть нет ссылок, которые помогают получить к ним доступ.Если у вас есть сомнения, что ваши объекты действительно исчезли, вы можете использовать любой из доступных профилировщиков Java.

Кстати, могу я посоветовать вам использовать одну из доступных реализаций объектов Mock вместо того, чтобы реализовывать такие вещи, как SerbletRequestStub самостоятельно?См. EasyMock, например.И еще один совет.Существуют расширения JUnit, которые уже реализуют все заглушки, связанные с Интернетом.Смотрите Apache Cactus.

0 голосов
/ 17 января 2011

Из-за независимости модульного теста JUnit создает новый объект MyTest для каждого метода теста.

То есть testFoo() и testBar() вызываются в разных экземплярах MyTest.Ваш код достаточно для проблемы с памятью, даже tearDown() в этом случае не требуется.Поскольку предыдущий экземпляр MyTest доступен для GC, его члены также доступны для GC, если на них ничего не ссылается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...