kotlin - Mockito:模拟间接注入的单例
问题描述
我有一个风暴螺栓类,它有很多带有 guice 的字段注入依赖项,其中一个MyMapper
是单例:
class MyBolt(val injector: Injector): BaseRichBolt {
...
@Inject
@Transient
private lateinit var myMapper: MyMapper
override fun prepare(Map stormConf, TopologyContext context, OutputCollector collector) {
super.prepare()
// actually inject the fields
this.injector.injectMembers(this)
}
override fun execute(input: Tuple) {
// use myMapper here to query database
val value: String = myMapper.read(someKey)
...
}
}
@Singleton
class MyMapper @Inject constructor(private val myDAO: MyDAO) {
...
fun read(key: String): String {
// use myDAO to read from database
return ...
}
}
我正在为螺栓编写一个测试,并且想模拟myMapper
它实际上不需要去数据库来读取一些value
. 在我的测试课中,我尝试像下面这样模拟它:
class MyTest {
private lateinit var injector: Injector
private lateinit var myBolt: MyBolt
private fun createInjector() : Injector {
// create the injector with my guice modules
...
}
@Before
fun setUp() {
injector = createInjector()
myBolt = Mockito.spy(MyBolt(injector))
}
@InjectMocks private val myMapper: MyMapper = mock(MyMapper::class.java)
...
@Test
fun test1() {
...
Mockito.`when`(myMapper.read(any()).thenReturn("something")
...
// execute on a test tuple and verify some method got called
myBolt.execute(someTuple)
verify(myBolt).someMethod(any())
}
}
我希望以上内容会将调用重定向myMapper.read()
到 return something
。但它仍然尝试从数据库中读取。任何想法我怎么能做到这一点?
解决方案
您错过了模拟的实际初始化,或者通过使用MockitoJUnitRunner.class
作为您的跑步者,或者通过调用Mockito.initMocks(this)
.
类似的东西:
@RunWith(MockitoJUnitRunner.class)
class MyTest {
// everything as it is right now
}
或者:
class MyTest {
@Before
fun setUp() {
injector = createInjector()
myBolt = Mockito.spy(MyBolt(injector))
Mockito.initMocks(this)
}
// everything else
}
推荐阅读
- flurry - 如何在 Flurry 中比较不同应用版本的漏斗步骤
- java - Java JDBC 中的 Concat SQL
- actions-on-google - 指南:如果您的操作未连接到 Dialogflow,则从旧的(旧版)Google Action (v2) 迁移到新的对话操作 (v3)
- google-api - 方法:edits.listings.update (Google Play Android Developer API) - 不工作
- c# - 从 DateTime 中摆脱毫秒的最佳方法是什么?
- bayesian - 贝叶斯应用程序来计算进入第 2 阶段的概率
- amazon-web-services - Cloudformation 无法解析参数 - VolumeAttachment
- rstudio-server - 运行 RStudio 的 Linux 平台上的 /home 将满的问题
- android - LiveData 已更改但未观察到:JetPack Compose
- flutter - 如何更改 CurvedNavigationBar 选定选项卡的背景颜色