2010-01-28 5 views
4

Я насмехаясь метод с EasyMock, который имеет дату в своем теле, что-то вроде этого:EasyMock с использованием даты ожидания

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

И мой тест выглядит следующим образом:

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

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

Неожиданный вызов метода testedMethod (Чт 28 января 9:45:13 GMT-03: 00 2010): checkedMethod (чт 28 января 09:45:13 GMT-03: 00 2010): ожидается: 1, актуально: 0

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

+1

См. Http://easymock.org/api/easymock/2.4/org/easymock/EasyMock.html#anyObject() – laura

ответ

3

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

//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); 
    ... 
} 
+1

Помните, что cal.setTimeInMillis (0l); сбрасывает время до 1 января 1970 года. Если вы просто хотите удалить millis, используйте cal.set (Calendar.MILLISECOND, 0); вместо. – Kagemusha

2

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

2

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

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

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

3

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

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

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

3

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

мысль, что я разделю мои 2 цента:

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

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

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

+0

Большое спасибо, этот помог мне. Чтобы интегрировать это решение в код OP: ожидать (провереноClass.testedMethod (EasyMock.isA (Date.class))) иReturn (false); –

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