Тестовый класс ниже проверяет, что простой HttpService получает контент с заданного URL. Обе показанные реализации делают тест пройденным, хотя одно явно неверно, потому что он создает URL с неверным аргументом.
Чтобы избежать этого и правильно указать желаемое поведение, я хотел бы проверить, что в блоке использования тестового примера я создаю один (и только один) экземпляр класса URL и что url
аргумент конструктора верен. Улучшение Groovy , похоже, позволило бы мне добавить утверждение
mockURLContext.demand.URL { assertEquals "http://www.foo.com", url }
но что я могу сделать без этого улучшения Groovy?
Обновление: Заменено "mock" на "заглушка" в заголовке, так как меня интересует только проверка состояния, не обязательно детали взаимодействий. В Groovy есть механизм StubFor, который я не использовал, поэтому я оставлю свой код как есть, но я думаю, что вы можете просто заменить MockFor на StubFor.
import grails.test.*
import groovy.mock.interceptor.MockFor
class HttpServiceTests extends GrailsUnitTestCase {
void testGetsContentForURL() {
def content = [text : "<html><body>Hello, world</body></html>"]
def mockURLContext = new MockFor(URL.class)
mockURLContext.demand.getContent { content }
mockURLContext.use {
def httpService = new HttpService()
assertEquals content.text, httpService.getContentFor("http://www.foo.com")
}
}
}
// This is the intended implementation.
class HttpService {
def getContentFor(url) {
new URL(url).content.text
}
}
// This intentionally wrong implementation also passes the test!
class HttpService {
def getContentFor(url) {
new URL("http://www.wrongurl.com").content.text
}
}