2013-02-15 2 views
2

비웃음하기 : 나는 그런 코드가 로그 객체

| 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()를 가리키는 :

@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() 
    } 
} 

그것은 실패합니다. 그게 뭐가 잘못 됐어?

답변

1

이것은 0 인수 생성자가없는 객체를 모의하려고 시도했을 때 발생하는 매우 알려지지 않은 오류 메시지입니다. 나는 당신이 다른 클래스의 멤버로부터 그것을 얻고 있기 때문에 당신이 거기에서 조롱하려고하는 클래스가 무엇인지 모르지만, Bean (인자없는)으로 생성 될 수 있는지를 체크 할 것이다. if 그렇지 않은 것 같습니다.

좀 더 살펴보면, 클래스 SLF4JLog에는 0 인수 생성자가 없다고 추측합니다.

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

mockFor를 사용하여 모의하기 위해, 당신은 다음의 라인을 따라 뭔가를해야합니다 (당신이 SLF4JLog 생성자에 대한 허용 무엇 인수를 결정해야합니다주의

이것은 당신이 필요로하는 것보다 더 복잡 할 수 있습니다. 나는 로거를 사용하는 어떤 클래스를 테스트하고 있다고 가정합니까? 그 클래스는 클래스 (정적 유형)에 의해 그 로거를 참조하지 않고 'def'를 대신 사용하기를 바랍니다. 이 경우 클래스가 Logger 객체에서 호출하는 모든 '메소드'를 가지고있는 이전 Stub (참조를 다시 참조하십시오)를 전달하면됩니다.

+1

답변 해 주셔서 감사합니다. 당신 말이 맞았습니다. 0-arg 생성자가 없으므로, 여러분의 제안에 따라 프록시 인스턴스를 사용하려고했습니다. 불행하게도 'GroovyCastException'을 받았습니다.'클래스 'SLF4JLog_delegateProxy'를 사용하여 'SLF4JLog_delegateProxy @ ef57f8'객체를 'org.apache.commons.logging.Log'클래스로 캐스팅 할 수 없으며 해결할 수 없습니다. 그러나 마침내 나는 해결책을 찾았다 : 나는 단지'service.log.class'를 인터페이스의 명시적인 이름 인'org.apache.commons.logging.Log'로 바꾸어야했다. 이것은 생성자를 필요로하지 않는다. . – eugene82