使用Mockito和InjectMocks时Kotlin懒惰块不执行

我正在使用Mockito来测试我的Kotlin代码。 这是一个网络应用程序,我用弹簧注入值的一些领域。

例如,我的课程代码片段如下所示:

class MyComponent { @Inject private lateinit var request: HttpServletRequest @Inject private lateinit var database: Database 

为了在我的单元测试中模仿这个,我使用了@InjectMocks@Mock@InjectMocks注解。 所以我的测试看起来像这样:

 class MyComponentTest { @Mock private lateinit var request: HttpServletRequest @Mock private lateinit var database: Database @InjectMocks private lateinit var sut: MyComponent @Before fun setup() { MockitoAnnotations.initMocks(this) } 

这一切工作正常。 不过,我的组件中也有一个懒惰的初始化块,像这样:

 val user: User by lazy { database.findUser() } fun getUsername(): String { return user.name } 

当我的测试调用myComponent.getUsername()我期望database.findUser()被调用,因为它初始化user但是这不会发生。

如果我在懒块中放置一个断点,它从来没有被打中。 现在我认为这与Mockito和@InjectMocks必须“触及” user的方式有关,但我并不知道。 如果我手动构造MyComponent然后执行懒惰块 – 但这不会注入我的嘲笑。

我如何确保从我的测试中正确调用了懒块?

更新 :一个星期没有,试图重现这个没有任何改变,我不能。 无法解释它。

我试图重现你的问题,不能这样做。 这个要点提供了一个工作的例子。

不过,我会建议重新审视你写测试的方式。 考虑下面的例子:

 class MyComponentTest { val request = mock<HttpServletRequest>() val database = mock<Database>() val sut = MyComponent(request, database) @Test fun username() { Mockito.`when`(database.findUser()).thenReturn(User("test")) val username = sut.getUsername() MatcherAssert.assertThat(username, Matchers.equalTo("test")) } } 

在我看来,比提到要点更容易理解。

如果你有兴趣的mock助手功能是一个班轮:

 inline fun <reified T : Any> mock() = Mockito.mock(T::class.java) 

完整更新的例子可以在这个要点中找到。