Java Kotlin:向guice注入的依赖项添加一个接口,这样我们就可以仅仅为了单元测试的目的模拟它们了?

Java Kotlin:向guice注入的依赖项添加一个接口,这样我们就可以仅仅为了单元测试的目的模拟它们了?,java,kotlin,mockito,guice,apache-storm,Java,Kotlin,Mockito,Guice,Apache Storm,我有一个storm拓扑,它使用guice在螺栓中注入各种依赖项。由于storm序列化/反序列化问题,依赖项不是构造函数注入的。我们将一个guiceinjector对象传递给bolt构造函数,并在bolt的prepare方法中使用它来字段注入依赖项(我知道这不理想,但目前还不知道更好的方案) 我正在使用测试GUI模块为bolt编写单元测试,这样我就可以为数据库控制器等注入模拟依赖项。为此,我需要将控制器类绑定到模拟类: bind(MyController::class.java).toInstan

我有一个storm拓扑,它使用guice在螺栓中注入各种依赖项。由于storm序列化/反序列化问题,依赖项不是构造函数注入的。我们将一个guice
injector
对象传递给bolt构造函数,并在bolt的
prepare
方法中使用它来字段注入依赖项(我知道这不理想,但目前还不知道更好的方案)

我正在使用测试GUI模块为bolt编写单元测试,这样我就可以为数据库控制器等注入模拟依赖项。为此,我需要将控制器类绑定到模拟类:

bind(MyController::class.java).toInstance(MockController())

但是,要使其工作,我必须使
MockController
继承自与
MyController
相同的接口/超类。我不确定的是,仅仅为了单元测试而向MyController添加接口是否是一种好的做法。

Kotlin有一个功能,允许您将函数实现为接口。看

然后用测试中想要的行为进行双重测试

class StubMyController : (Int) -> String {
    override fun invoke(in: Int) : String = "Test Logic"
}
然后用注射器注入测试液

bind(MyController::class.java).toInstance(StubMyController())
一节课你只能做一次。我使用了这个特性,而不是额外的接口或向类添加open。它认为这非常有助于确立坚实的原则。它们还有很多优点,但是在一个类上只有一个公共方法当然可以帮助人们将注意力集中在SOLID上

我理解将相关方法分组到一个类中的愿望,但是使用Kotlin,您可以将两者结合起来。您可以使用一个公共方法创建非常简单的类,但可以将这些相关类分组到单个文件中。很难解释为什么这会有帮助,但它确实可以使测试更容易、更可读


您还可以使用mock直接模拟依赖项

我不知道函数作为接口的方法会是什么样子。你能告诉我在我的例子中它是什么样子吗?另外,
MyController
有一些我需要模仿的方法。因此,如果我只能做一次,它可能无法满足我的需要?我已经简单地阅读了
mock
的文档,它看起来非常有趣。然而,我在文档中看到的所有示例都是直接模拟对象,而不是模拟从guice注入器派生的间接对象。
class StubMyController : (Int) -> String {
    override fun invoke(in: Int) : String = "Test Logic"
}
bind(MyController::class.java).toInstance(StubMyController())