2015-01-20 2 views
2

Для целей тестирования мне нужно переопределить «равно» метод:Как издеваться над String.equals в Groovy?

def any = [equals: { true }] as String 
any == 'should be true' 
// false 

Более подробно о проблеме:

class EmployeeEndpointSpec extends RestSpecification { 

    void "test employee"() { 
     when: 
      get "/v1/employee", parameters 
     then: 
      expectedStatus.equals(response.statusCode) 
      expectedJson.equals(response.json) 
     where: 
      parameters << [ 
       [:], 
       [id: 824633720833, style: "small"] 
      ] 
      expectedStatus << [ 
       HttpStatus.BAD_REQUEST, 
       HttpStatus.OK 
      ] 
      expectedJson << [ 
       [errorCode: "badRequest"], 
       [ 
        id: 824633720833, 
        name: "Jimmy", 
        email: "[email protected]", 
        dateCreated:"2015-01-01T01:01:00.000", // this value should be ignored 
        lastUpdated: "2015-01-01T01:01:00.000" // and this 
       ] 
      ] 
    } 
} 

lastUpdated и dateCreated может изменяться во времени, и мне нужно как-то их игнорировать.

+1

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

+1

Мне это нужно для тестирования ответа REST (JSON преобразован в карту). Моя задача - проверить, что возвращаемый ответ такой же, как ожидалось, за исключением некоторых значений - их следует игнорировать. Пример ответа: '[sucess:" true ", date:" 2015-01-01 "]', и я хочу что-то вроде этого [[sucess: "true", date: new AnyValue] .equals (response) '. – AndreyT

+0

Напишите код вашего модульного теста и объясните, ЧТО вы хотите протестировать, а не КАК. – kazanaki

ответ

1

Если нет необходимости сравнивать упомянутые поля - удалить их:

class EmployeeEndpointSpec extends RestSpecification { 

    void "test employee"() { 
     when: 
      get "/v1/employee", parameters 
     then: 
      expectedStatus.equals(response.statusCode) 
      def json = response.json 
      json.remove('dateCreated') 
      json.remove('lastUpdated') 
      expectedJson.equals(response.json) 
     where: 
      parameters << [ 
       [:], 
       [id: 824633720833, style: "small"] 
      ] 
      expectedStatus << [ 
       HttpStatus.BAD_REQUEST, 
       HttpStatus.OK 
      ] 
      expectedJson << [ 
       [errorCode: "badRequest"], 
       [ 
        id: 824633720833, 
        name: "Jimmy", 
        email: "[email protected]", 
        dateCreated:"2015-01-01T01:01:00.000", 
        lastUpdated: "2015-01-01T01:01:00.000" 
       ] 
      ] 
    } 
} 

Я также отдельные испытания отрицательные и положительные сценарии.

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

then: 
def json = response.json 
json.id == 824633720833 
json.name == "Jimmy" 
json.email == "[email protected]" 
json.dateCreated.matches('<PATTERN>') 
json.lastUpdated.matches('<PATTERN>') 

В случае Вам не нравятся последние две строки он может быть заменен:

json.keySet().contains('lastUpdated', 'dateCreated') 
+0

Но что, если JSON вложен? Удаление этих полей из вложенных карт будет утомительным – AndreyT

+0

@AndreyT, в примере выше JSON не вложен. Пожалуйста, дайте пример реального мира, потому что кажется, что я пытаюсь решить неправильную проблему. – Opal

+0

Это настоящий пример, но я тоже нашел ответ на будущие тесты. Благодарю. – AndreyT

1

Отвечаю:

String.metaClass.equals = { Object _ -> true } 
+0

Другой ответ и комментарии полезны, но спасибо за то, что он действительно спросил. – orbfish

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