2013-02-15 4 views
2

У меня есть такой код:Дразнящий объект журнала

@TestFor(MyService) 
class MyServiceTests { 
    void testIt() { 
     def logTo = [] 
     def loggerMock = mockFor(service.log.class) 
     loggerMock.demand.error(1..1) { String msg, Exception ex -> 
      logTo << [level: 'error', msg: msg, ex: ex] 
     } 
     service.log = loggerMock.createMock() 
    } 
} 

Он терпит неудачу с:

| Failure: testIt(MyServiceTests) 
| java.lang.ArrayIndexOutOfBoundsException: 0 
    at SLF4JLog_groovyProxy.<init>(Script1.groovy:4) 
    at Script1.run(Script1.groovy:8) 
    at grails.test.GrailsMock.createMock(GrailsMock.groovy:91) 
    at package.MyServiceTests.testIt>>>(MyServiceTests.groovy:25) 

указывая на линии service.log = loggerMock.createMock(). Что с этим не так?

ответ

1

Это ужасно неинформативное сообщение об ошибке, которое я получил при попытке создания объектов, у которых нет конструктора с 0 аргументами. Я не знаю, какой класс это значит, что вы пытаетесь насмехаться там, так как вы получаете его от другого члена класса, но я бы проверял, что он может быть построен как Bean (без аргументов) и, если не, это, наверное, проблема.

Если вы посмотрите немного дальше, я предполагаю, что класс SLF4JLog не имеет конструктора с 0 аргументами. Для того, чтобы дразнить его с помощью mockFor, вам нужно сделать что-то вдоль линий следующих (обратите внимание, вы должны определить, какие аргументы являются приемлемыми для конструктора SLF4JLog:

void test_create_proxy_instance_with_constructor_arguments() { 
    def mock = new MockFor(MockForTestClassWithConstructorArgs) 
    mock.demand.amethod { "from mock with proxy"} 

    def proxy = mock.proxyInstance(["value1", "value2"]as Object[]) 
    assertEquals "from mock with proxy", proxy.amethod() 
    mock.verify proxy 
    } 

Источник: http://groovy.codehaus.org/Using+MockFor+and+StubFor

Это может быть больше, чем вам нужно. Я полагаю, вы тестируете какой-то класс, который использует регистратор? Надеюсь, этот класс не относится к этому логгеру по классу (статический тип) и вместо этого использует «def». В этом случае вы можете просто пройти в любом старом Stub (см. Ссылку снова), который имеет все «методы», которые ваш класс вызывает в объекте Logger.

+1

спасибо за ваш ответ. Вы были правы, нет конструктора 0-arg, поэтому я попытался использовать экземпляр прокси, согласно вашему предложению. К сожалению, у меня есть «GroovyCastException»: «Нельзя передать объект« SLF4JLog_delegateProxy @ ef57f8 »с классом« SLF4JLog_delegateProxy »в класс« org.apache.commons.logging.Log »и не мог обойти его. Но, наконец, я нашел решение: мне нужно было просто заменить «service.log.class» в моем вопросе явным именем интерфейса: 'org.apache.commons.logging.Log', который не требует конструктора , – eugene82

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