我的代码设置如下:
package foo.bar.service
SomeService(someRepository: SomeRepository)
package foo.bar.repository
SomeRepository(mongoClient: MongoClient)
我正在为SomeService
以下内容编写单元测试:
@MicronautTest(startApplication=false)
internal class SomeServiceTest {
@Inject
private lateinit var someRepository: SomeRepository
@MockBean(SomeRepository::class.java)
@Primary
fun someRepository = mock(SomeRepository::class.java)
@Inject
private lateinit var someService: SomeService
@Test
fun `some test`() {
...
}
}
我认为由于我已经模拟了存储库实例,它不会实例化调用 Mongo DB,但是当测试开始时它会实例化与 mongo 的连接,我无法理解为什么会发生这种情况。为什么要实例化与 MongoDB 的连接?
我尝试通过以下方式模拟 Mongo 客户端:
@MockBean(MongoClient::class.java)
@Primary
fun mongoClient = mock(MongoClient::class.java)
它可以工作,这次没有连接到 Mongo DB,所以出于某种原因,所以在第一种情况下,它正在实例化 Monog 客户端的一个实例,即使我已经模拟了 SomeRepository。
有人可以告诉我,为什么会这样,我怎样才能达到我想要的结果?
编辑:我厌倦了 Micronaut 测试中的包,以限制被扫描的包的范围仅限于我的包,像这样
@MicronautTest(startApplication=false, packages=["foo.bar.service", "foo.bar.repository"])
但即使这样也无济于事,由于某种原因,实例化了与 Mongo DB 的连接,这意味着 Mongo Client 是出于某种原因创建的。