Easymock, используя ожидание даты - PullRequest
6 голосов
/ 28 января 2010

Я издеваюсь над методом с easymock, который имеет дату в своем теле, что-то вроде этого:

public void testedMethod() {
    ...
    if (doSomething(new Date())) {
    ...
}

И мой тест выглядит так:

public void testThatMethod() {
    ...
    expect(testedClass.testedMethod(new Date())).andReturn(false);
    ...
}

Но когда я запускаю тест, иногда я получаю сообщение об ошибке:

Неожиданный вызов метода testMethod (четверг, 28 января 09:45:13 GMT-03: 00 2010): проверенный метод (четверг, 28 января 09:45:13 GMT-03: 00 2010): ожидаемый: 1, фактический: 0

Я думаю, что это потому, что иногда дата немного отличается. Я попробовал некоторые гибкие ожидания без успеха. Есть ли способ обойти это?

Ответы [ 5 ]

4 голосов
/ 09 мая 2012

Мы постоянно сталкиваемся с похожими проблемами, и вот альтернативы, которые я вижу:

  1. Укажите дату в качестве параметра метода (+) Быстрая смена (-) немного грязно - когда вы просто хотите использовать «сейчас», это также загрязняет ваш интерфейс
  2. Получите дату от соавтора "QueryCurrentDateProvider" (+) Все еще довольно быстро (+) Также можно поиздеваться -> Вы уверены, что используете ту же дату (-) ненужные соавторы созданы для каждого сервиса, где вам нужно сделать что-то подобное
  3. Напишите свой собственный механизм сопоставления аргументов EasyMock, в котором вы абстрагируетесь от того, что действительно хотите делать - когда вам просто интересен день, а не время, когда вы можете использовать что-то вроде commons DateUtils.isSameDay для запуска (+) самое чистое решение (+) без изменений в вашем производительном коде (-) Вы должны написать свой собственный сопоставитель (хотя я не понимаю, почему в EasyMock его еще нет)
  4. Переместите «new Date ()» в приватный метод, затем смоделируйте этот метод с помощью PowerMock. (+) быстро (+) небольшое изменение в производительном коде (-) представить макет мощности как зависимость
  5. Измените параметр с Date на String и используйте общий шаблон для преобразования даты в строку перед вызовом метода (+) быстро (+) без дополнительного кода, библиотеки, необходимые на сайте тестирования (-) Вы должны отформатировать дату перед вызовом метода и проанализировать дату в вызываемом методе

Так что это действительно зависит от ваших личных предпочтений. Когда вы много работаете с текущими временными метками, я бы порекомендовал сопоставить аргументы - так как эти инвестиции быстро окупятся.

4 голосов
/ 28 января 2010

Прекратите использовать новую дату (), используйте календарь с постоянным временем.

//Declare the Calendar in your test method
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(0l);

//receive the calendar to be used in testedClass constructor
public void testedMethod() {
    ...
    if (doSomething(cal.getTime())) {
    ...
}

//use the same calendar to make the assertion
public void testThatMethod() {
    ...
    expect(testedClass.(testedMethod(cal.getTime())).andReturn(false);
    ...
}
3 голосов
/ 28 сентября 2012

Я только что нашел эту ветку, и она помогла мне решить проблему, в которой я застрял в течение хорошего часа.

Думал, что поделюсь своими 2 центами:

Если вас не интересует значение даты, и вы просто хотите знать, что это объект Date, просто используйте предопределенное сопоставление EasyMock:

EasyMock.expect(objectMock.isPollingTimeOut(EasyMock.eq(600000L), EasyMock.isA(Date.class), EasyMock.eq(someMock))).andReturn(false);

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

2 голосов
/ 28 января 2010

Возможно, миллисекундная часть дат отличается. Вам, вероятно, нужно обнулить это с помощью Calendar.set() перед созданием объекта даты:

Calendar myCalendar = Calendar.getInstance();
myCalendar.set(Calendar.MILLISECOND, 0);
Date testDate = myCalendar.getTime();

Но это предположение:)

2 голосов
/ 28 января 2010

Если вы можете точно выяснить, почему он терпит неудачу, вы можете написать свой собственный сопоставитель, чтобы более гибко сопоставлять дату. Смотрите раздел по матчам http://easymock.org/EasyMock2_2_Documentation.html

...