我有两个由 Guice 注入的非关键服务的实现。这些实现将结果发布到另一个系统。当我在本地运行时,无法连接到其他系统。我有两个实现发布接口的类:
RealPublisher
和EchoPublisher
。 EchoPublisher 记录它传递的内容并返回成功。当我测试应用程序时,我使用 EchoPublisher
。我需要在部署时将其更改为 RealPublisher
。
我可以看到通过
@Provides
方法来检测环境并返回正确的实现。或者在构建注入器时更换整个模块。
我的构建系统是 Gradle,当它用于启动应用程序时,它不会设置像 Bazel 这样的任何环境变量(据我所知),所以我需要一些其他方法来检测环境。有
Guice.Stage
值,可以通过 @Provides
方法轻松实现这一点。当然,我也必须知道何时切换该标志。
是否有一个好方法来处理交换实现,而不必记住每次都手动执行?
执行此操作的一种简单方法是在测试时设置系统属性:
// build.gradle
test {
systemProperty("IS_UNDER_TEST", "true")
}
然后在您的应用程序中,您可以在进行 Guice 绑定时检查此属性是否存在,并在检测到时绑定您的测试对象
EchoPublisher
。