junit MockK无法从扩展的抽象类的方法中解析泛型T

tcomlyy6  于 2023-06-29  发布在  其他
关注(0)|答案(1)|浏览(119)

我的所有服务都扩展了一个抽象类DefaultBaseService<T :HasID<ID>, ID>,其中包含一些基本的CRUD方法,如:

override suspend fun update(id: ID, obj: T): T {
    obj.id = id
    return save(obj)
}
override suspend fun update(id: ID, map: HashMap<String, Any>): T {
 /* ... */
return update(id, obj)
}

所以我的服务是这样扩展的:

@Service
class FooService(val fooRepository: FooRepository): DefaultBaseService<Foo, ObjectId>(fooRepository, Foo::class)

我有一个RabbitMQ侦听器类FooListener,其中注入了这个服务,我正在尝试使用MockK和JUnit进行测试。
我的测试课是这样的

@ExtendWith(MockKExtension::class)
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
@SpringBootTest
class FooListenerTests {

    @MockK
    lateinit var fooService: FooService

    @MockK
    lateinit var barService: BarService

    @InjectMockKs
    lateinit var listener: FooListener

    @BeforeAll
    fun setUp() = MockKAnnotations.init(this, relaxUnitFun = true)

    @Test
    fun `should listen do event`() {
        coEvery { fooService.create(any()) } returns Templates.foo
        coEvery { fooService.save(any()) } returns Templates.foo
        coEvery { fooService.update(any(), any<Foo>()) }
        coEvery { barService.create(any()) } returns Templates.bar

        listener.listenToSomething(Templates.event)
    }
}

当我运行测试时,我得到这个错误

Jun 27, 2023 12:16:14 PM io.mockk.impl.log.JULLogger warn
WARNING: Failed to transform class com/numih/mongodb/commons/service/DefaultBaseService
java.lang.IllegalArgumentException: Cannot resolve T from static java.lang.Object com.numih.mongodb.commons.service.DefaultBaseService.update$suspendImpl(?)

我已经尝试使用Mockito而不是MockK,但不断得到相同的错误,我已经有一段时间没有在我的应用程序中创建测试,由于这个错误
我还尝试将any<Foo>()替换为ofType(Foo::class),但生成相同的错误

q5iwbnjs

q5iwbnjs1#

您可以将@MockK annotation从Spring Starter Test dependency替换为@MockBean
那么最终的类应该是这样的

@ExtendWith(MockKExtension::class)
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
@SpringBootTest
class FooListenerTests {

    @MockBean
    lateinit var fooService: FooService

    @MockBean
    lateinit var barService: BarService

    @InjectMockKs
    lateinit var listener: FooListener

相关问题