Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Cannot create mock for class LoginService. Mocking of non-interface types requires the CGLIB library..?

I'm using grails 2.4.2 and by default it already has spock installed right? Well, one of my controller tests isn't working quite right. I'm trying to mock several of my services, but I keep getting this error:

 Failure:  confirmEmailAddress() when verification failed(com.zee.RegistrationControllerSpec)
|  org.spockframework.mock.CannotCreateMockException: Cannot create mock for class com.zee.LoginService. Mocking of non-interface types requires the CGLIB library. Please put cglib-nodep-2.2 or higher on the class path.
    at org.spockframework.mock.runtime.ProxyBasedMockFactory.create(ProxyBasedMockFactory.java:52)
    at org.spockframework.mock.runtime.JavaMockFactory.create(JavaMockFactory.java:51)
    at org.spockframework.mock.runtime.CompositeMockFactory.create(CompositeMockFactory.java:44)
    at org.spockframework.lang.SpecInternals.createMock(SpecInternals.java:47)
    at org.spockframework.lang.SpecInternals.createMockImpl(SpecInternals.java:282)
    at org.spockframework.lang.SpecInternals.MockImpl(SpecInternals.java:83)
    at com.zee.RegistrationControllerSpec.setup(RegistrationControllerSpec.groovy:22)

I couldn't really find anything on the internet about this. My controllerSpec looks like this:

import grails.test.mixin.TestFor
import spock.lang.Specification

@TestFor(RegistrationController)
class RegistrationControllerSpec extends Specification {

    LoginService loginService

    EmailAddressConfirmationService emailAddressConfirmationService

    EmailNotificationService emailNotificationService

    AccountRecordService accountRecordService

    def setup() {
        loginService = Mock()
        emailAddressConfirmationService = Mock()
        emailNotificationService = Mock()
        accountRecordService = Mock()

        controller.loginService = loginService
        controller.emailAddressConfirmationService = emailAddressConfirmationService
        controller.emailNotificationService = emailNotificationService
        controller.accountRecordService = accountRecordService
    }

    def cleanup() {
    }

    void "confirmEmailAddress() when verification failed"() {
        // some test here....
    }
}

My Service is even simpler:

import grails.transaction.Transactional

@Transactional
class LoginService {

    def registerUser(Login login) {
        login.pincode = "";
        login.groupId = Login.REGISTERED_USER_GROUP_ID
        login.save(flush :true)
    }

    public void userJoined(Login login) {
        login.save(flush: true)
    }
}

I am stomped. Even a grails clean wouldn't do the trick.. Any help? D:

like image 544
shy dildo Avatar asked Aug 16 '14 08:08

shy dildo


1 Answers

In your buildConfig.groovy, Replace this line: ':cache:1.1.7' with ':cache:1.1.6' Like so:

plugins {
         compile ':cache:1.1.6'
}

Turns out that the cglib dependency was removed from the cache plugin. source.

edit: If you still want to use cache:1.1.7 you can just add the cglib dependency in your buildConfig.groovy like this:

dependencies { 
        compile 'org.objenesis:objenesis:1.4'
        compile "cglib:cglib:2.2"
}
plugins {
             compile ':cache:1.1.7'
}
like image 111
Petra Avatar answered Oct 05 '22 23:10

Petra



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!