在我的服务文件夹中,我有这个文件
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函数?
答案 0 :(得分:2)
您无法实例化抽象类,因此无法创建要测试的抽象类。使它成为非抽象的,或创建一个具体的子类并测试它。
此外,由于您有一个带参数的构造函数,因此没有默认(no-arg)构造函数。如果你没有构造函数,编译器会为你添加一个(在Java和Groovy中)和在Grails中,因为服务是自动注册的,你必须有一个no-arg构造函数(你可以拥有其他的,但我不明白为什么你会这样,所以Spring可以创建实例。您始终可以手动将类连接为Spring bean并在resources.groovy
中提供构造函数args,但它不会是Grails服务,因此最好将其放在src/groovy
中。 / p>