gpt4 book ai didi

android - Dagger 2 中的测试模块和注入(inject)

转载 作者:太空宇宙 更新时间:2023-11-03 10:40:26 25 4
gpt4 key购买 nike

我目前正在开发一个 Android MVP 应用程序,我正在尝试将我的依赖项分离到不同的 Dagger2 模块中。

我遇到的问题是关于在单元测试时间更改模块。场景如下:

  • LoginComponent,它使用两个模块:LoginModule 和 HTTPModule
  • LoginModule 在其中一个方法中需要一个由 HTTPModule 提供的 OkHttp 实例。

代码如下:

@Singleton
@Component(modules = {LoginModule.class, HTTPModule.class})
public interface LoginComponent {

}

@Module(includes = {HTTPModule.class})
public class LoginModule {

@Provides
@Singleton
public MyThing provideMyThing(OkHttpClient client) {
// Do things with it
}
}

@Module
public class HTTPModule {

@Provides
@Singleton
public OkHttpClient provideOkHttpClient(){
// Return the OkHttpClient
}
}

问题是,在测试时我需要更改返回的 OkHttpClient(通过让它接受所有证书,因为当我在 JVM 上运行它时它不接受 LetsEncrypt 证书)。

我还需要它,因为我需要声明 MyTest.class 可以用模块注入(inject),因为 MyTest.classapp/src/test/文件夹,对于放在app/src/main/下的类是不可见的。到目前为止,我所做的是将组件和模块复制并粘贴到 /test/ 文件夹,并在那里进行注入(inject)类声明。但我知道必须有一种适当的方法来实现我正在寻找的东西。

我尝试过的另一件事是使用自定义作用域对方法进行注释(创建一个 @TestScope 注释)。然而,这导致我遇到了我之前评论过的相同问题:我无法使组件可见 MyTest.class,因为它位于 /test/ 文件夹下。

我已经检查过其他类似的问题,例如this onethis another one ,但最后一个用于使用 Robolectric 运行测试,现在我可以仅使用 JUnit4 (Android Studio 2-Beta 8) 对我的大部分代码进行单元测试。

如果有人能指出正确的方向,我将不胜感激。

提前致谢!

最佳答案

您正在以一种仍然保持代码紧密耦合的方式使用依赖注入(inject)。一般来说,您希望依赖项是接口(interface)而不是实际的类。这使您的代码美观、松散,易于阅读、修改和维护。

将您的网络操作隐藏在接口(interface)后面,以便您可以在需要时修改网络实现。这可以用于测试 - 在您的情况下,但它还允许您在将来想要或需要时切换网络库,而无需更改任何其他代码。

尝试这样的事情:

@Module
public class HTTPModule {

@Provides
@Singleton
public NetworkProvider provideNetworkProvider(){
// Return the Network provider
}
}

网络抽象层:

public interface NetworkProvider {
// Methods to send requests and receive async responses
}

OkHttp 实现:

public class OkHttpNetworkProvider implements NetworkProvider {
// Implement NetworkProvider. This is the only class that
// knows about OkHttp and its components
}

现在您可以创建 NetworkProvider 的模拟版本并将其用于测试,无论是通过测试模块还是直接使用。

关于android - Dagger 2 中的测试模块和注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35100127/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com