Юнит с новой датой () - PullRequest
       14

Юнит с новой датой ()

7 голосов
/ 23 февраля 2011

Каким будет тест junit, если у меня есть следующий метод:

@Override
public void saveLastSuccesfullLogin(final User user) {
    gebruiker.setLastLogin(new Date());
    storeUser(user);
}

submethode storeUser:

@Override
public void storeUser(final User user) {
    EntityManager em = emf.createEntityManager();

    em.getTransaction().begin();
    em.merge(user);
    em.getTransaction().commit();

    em.close();
}

У меня проблема с датой, устанавливаемой для сущностипользователь, а затем сохраняется.Я использую junit и easymock.

Ответы [ 4 ]

4 голосов
/ 25 февраля 2011

Попробуйте добавить новую функцию Date () в метод со спецификатором доступа по умолчанию, как показано ниже

@Override
public void saveLastSuccesfullLogin(final User user) {
    gebruiker.setLastLogin(getDate());
    storeUser(user);
}
Date getDate() {
    return new Date();
}

В своем тестовом классе переопределите класс, как показано ниже, используя фиктивную или заглушенную дату.

<ClassUnderTest> classUnderTest = new <ClassUnderTest> () {
  @Override 
  Date getDate() {
    return mockDate;
  } 
}

Таким образом, вы можете легко установить значение даты, так как оно будет уничтожено.

3 голосов
/ 24 февраля 2011

В чем проблема с датой?Что вы не знаете, что утверждать позже?Несколько альтернатив:

  1. Передать дату в метод
  2. Создать фабрику, чтобы получить текущую дату / время, чтобы вы могли смоделировать ее
  3. Утвердить датув пределах порога правильности
0 голосов
/ 03 октября 2014

Вы также можете создать метод getDate и статическую переменную даты:

    private static Date thisDate = null;

    @Override
    public void saveLastSuccesfullLogin(final User user) {
        gebruiker.setLastLogin(getDate());
        storeUser(user);
    }

    public Date getDate() {
        if(thisDate != null) return thisDate;
        return new Date();
    }

    public void setDate(Date newDate) {
        thisDate = newDate;
    }

Затем в своем тестовом методе вы можете продолжить и вызвать setDate, чтобы контролировать, какую дату вы получите.

0 голосов
/ 05 августа 2011

Существует также более «корпоративный» подход, который можно использовать там, где доступно внедрение зависимостей (как в EJB, Spring и т. Д.).

Вы можете определить интерфейс, например TimeService, и добавить метод e, который возвращает текущую дату.

  public interface TimeService {
    Date getCurrentDate();
  }

Вы можете реализовать это для возврата new Date() и использовать его так:

  gebruiker.setLastLogin(timeService.getCurrentTime());

Очевидно, что это будет очень легко проверить, потому что вы можете высмеивать TimeService. Используя EasyMock (просто пример), это может быть:

  Date relevantDateForTest = ...
  expect(timeService.getCurrentTime()).andReturn(relevantDateForTest);
  replay(timeService);

Использование TimeService во всем коде и никогда не использование new Date() - довольно хорошая практика, а также имеет другие преимущества. Я нашел это полезным в ряде случаев, включая ручное функциональное тестирование функций, которые будут активированы в будущем. Более того, системное время может быть получено из внешней системы, что делает его согласованным по кластерам и т. Д.

...