Почему HttpClient не работает должным образом между модульными тестами в Grails - PullRequest
0 голосов
/ 27 марта 2012

У меня есть два модульных теста контроллера, и каждый из них устанавливает метакласс HttpClient, выполняемый в setUp (), как показано ниже:

HttpClient.metaClass.execute = { HttpUriRequest request ->
    <return expected data for my tests>
}

Затем я пытаюсь разрушить метакласс в tearDown () с помощью следующего кода:

protected void tearDown() {
    super.tearDown()
    GroovySystem.metaClassRegistry.removeMetaClass(HttpClient.class)
}

Однако только один из моих модульных тестов проходит, потому что возврат из HttpClient является неправильным / неожиданным Если я добавлю логику, необходимую для обоих тестов, в metaClass.execute обоих тестов, я не получу ошибок тестирования. Однако это громоздко и непрактично, особенно в гибкой среде разработки.

Что я делаю не так, пытаясь разрушить эту регистрацию метакласса HttpClient? Как я могу устранить эту проблему дальше?

В настоящее время я использую Grails 1.3.7 при установке CentOS 5.

Редактировать: Я должен уточнить, что моя проблема в том, что переопределение метакласса вызывает проблемы между тестовыми классами , а не тестовыми случаями. Мы настроили переопределение метакласса, чтобы оно возвращало правильные данные для всех тестовых случаев в данном классе. Таким образом, у класса Test A есть данные метакласса для его тестовых случаев, а у класса Test B есть данные метакласса для его тестовых случаев. Проблема заключается в том, что, поскольку тестовый класс A тестируется первым, тестовый класс B заканчивается использованием метакласса из тестового класса A и из-за этого не работает.

Ответы [ 2 ]

0 голосов
/ 06 апреля 2012

Решение, которое я в итоге использовал, немного взломано, но его легче поддерживать. Я только что создал класс в src / groovy, который создает HttpClient.metaClass, а затем просто заставил каждый тестовый класс, который нуждается в этом, запустить статический метод в новом классе. Таким образом, весь необходимый код для мета-классификации находится в одном месте.

0 голосов
/ 27 марта 2012

Вам не нужно реализовывать метод tearDown.Предполагая, что вы расширяете ControllerUnitTestCase или GrailsUnitTestCase Если вы вызовете registerMetaClass HttpClient перед метаклассом метода execute, он заменит метакласс для HttpClient между тестовыми классами для вас.Я никогда не использовал метод removeMetaClass, поэтому я не знаю, почему это не сработало, поэтому я не могу ответить на вопрос, почему это не работает, но это должно помочь вам решить вашу проблему.

...
registerMetaClass HttpClient
HttpClient.metaClass.execute = { HttpUriRequest request ->
    <return expected data for my tests>
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...