单元测试服务返回“无法添加服务类”错误消息

时间:2014-03-21 19:53:38

标签: unit-testing grails spock

在我的服务文件夹中,我有这个文件

abstract class AsyncUploadedFileService<T> {

    def grailsApplication
    def jesqueService

    String jobName
    String workerPool
    String _queueName

    AsyncUploadedFileService (Class<T> job, String workerPool) {
        jobName = job.simpleName
        this.workerPool = workerPool
    }
}

我有一个单元测试

@Build(UploadedFile)
@TestMixin(GrailsUnitTestMixin)
@TestFor(AsyncUploadedFileService)
class AsyncUploadedFileServiceSpec extends Specification {
    def setup() {
        User.metaClass.encodePassword = {-> }
    }

    void "add to the worker pool"() {
        when:
        UploadedFile uploadedFile = UploadedFile.build()

        then:
        service.perform(uploadedFile)

    }
}

当我运行测试时,我收到以下错误

Cannot add Service class [class com.example.AsyncUploadedFileService]. It is not a Service!
org.codehaus.groovy.grails.exceptions.GrailsConfigurationException: Cannot add Service class [class com.example.AsyncUploadedFileService]. It is not a Service!
at grails.test.mixin.services.ServiceUnitTestMixin.mockService(ServiceUnitTestMixin.groovy:46)
at org.spockframework.util.ReflectionUtil.invokeMethod(ReflectionUtil.java:138)
at org.spockframework.runtime.extension.builtin.JUnitFixtureMethodsExtension$FixtureType$FixtureMethodInterceptor.intercept(JUnitFixtureMethodsExtension.java:145)
at org.spockframework.runtime.extension.MethodInvocation.proceed(MethodInvocation.java:84)
at org.spockframework.util.ReflectionUtil.invokeMethod(ReflectionUtil.java:138)
at org.spockframework.util.ReflectionUtil.invokeMethod(ReflectionUtil.java:138)
at org.spockframework.util.ReflectionUtil.invokeMethod(ReflectionUtil.java:138)

这是错误,因为我使用的是service.perform()语法吗?如果是这样,还有什么方法可以测试AsynchUploadedFileService函数?

1 个答案:

答案 0 :(得分:2)

您无法实例化抽象类,因此无法创建要测试的抽象类。使它成为非抽象的,或创建一个具体的子类并测试它。

此外,由于您有一个带参数的构造函数,因此没有默认(no-arg)构造函数。如果你没有构造函数,编译器会为你添加一个(在Java和Groovy中)和在Grails中,因为服务是自动注册的,你必须有一个no-arg构造函数(你可以拥有其他的,但我不明白为什么你会这样,所以Spring可以创建实例。您始终可以手动将类连接为Spring bean并在resources.groovy中提供构造函数args,但它不会是Grails服务,因此最好将其放在src/groovy中。 / p>