当前位置: 首页 > 知识库问答 >
问题:

当服务注入Dagger 2时,单元测试改装调用

符风畔
2023-03-14

我使用Dagger2在Android应用程序中提供我的所有类。我想对我的repository类进行单元测试,它在构造函数中提供了翻新服务。

class MainRepository(private val service: ImageService) {

fun download(username: String, liveData: MutableLiveData<ImageDownloadResult>) {
    service.downloadImage(username).enqueue(object : Callback<ImageResponse> {
        override fun onFailure(call: Call<ImageResponse>, t: Throwable) {
            liveData.value = DownloadFailed(t)
        }

        override fun onResponse(call: Call<ImageResponse>, response: Response<ImageResponse>) {
            if (response.isSuccessful) {
                response.body()?.let {
                    liveData.value = DownloadSuccessful(it.image)
                }
            } else {
                liveData.value = DownloadFailed(
                    when (response.code()) {
                        401 -> Unauthorized()
                        403 -> Forbidden()
                        404 -> NotFound()
                        in 500..599 -> InternalServerError()
                        else -> General()
                    }
                )
            }
        }
    })
}

}

网络模块类通过以下方式提供服务:

@Provides
@Singleton
fun provideImageService(gson: Gson, okHttpClient: OkHttpClient): ImageService {
    return Retrofit.Builder()
        .addConverterFactory(GsonConverterFactory.create(gson))
        .baseUrl(mBaseUrl)
        .client(okHttpClient)
        .build()
        .create(ImageService::class.java)
}

我试图使用Mockito来模拟类,但是我在下载方法中得到NullPointerExc0019。

public class MainRepositoryTest {

@Rule
public MockitoRule mockitoRule = MockitoJUnit.rule();
@InjectMocks
ImageService service;

@Before
public void setup() {
    MockitoAnnotations.initMocks(this);
}

@Test
public void testImageDownload() {
    MutableLiveData<ImageDownloadResult> liveData = new MutableLiveData<>();
    Response<ImageResponse> response = null;
    try {
        response = service.downloadImage("test").execute();
        assertEquals(response.code(), 200);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

}

请告诉我如何将服务注入测试,以便我可以在那里调用Http调用。非常感谢。

共有1个答案

苍德寿
2023-03-14

我想你把这里的一些东西弄混了。在测试中,您似乎在测试服务,而不是存储库。服务需要被嘲笑,以便实际返回一些东西,而不是null。

让我们从测试设置开始。你必须声明模拟和你正在测试的东西

public class MainRepositoryTest {

  @Rule
  public MockitoRule mockitoRule = MockitoJUnit.rule();
  @Mock
  ImageService service;
  @InjectMocks
  MainRepository repository;

   //...
 }

存储库是您将在此处实际测试的内容。实际上,您只需获得一个注入了服务模拟的存储库实例。但是,此模拟将在每次方法调用时返回null。

现在,您需要为每个要测试的案例设置它。假设您要测试成功的响应:

@Test
public void testSuccess (){
    when(service.downloadImage("test")).theReturn(<successful response>);

     repository.download("test", <mutable live data>);

     // Now assert something about the live data
}

当使用预期的参数调用时,您必须模拟服务以返回成功的响应。我不确定如何在这里使用实时数据,因为我从未使用过它。我实际上认为改装已经支持了这一点,你不必手动转换它。

至于dagger,使用依赖注入是很好的。然而,在测试中,通常不使用dagger注入依赖项。在这里使用mockito注释就足够了。

 类似资料:
  • 问题内容: 我正在测试服务A,但是服务A取决于服务B(即服务B已注入服务A)。 我已经看到了这个问题,但是我的情况有所不同,因为我认为_模拟_ 服务B而不是注入服务B的实际实例更有意义。我将用茉莉间谍对其进行模拟。 这是一个示例测试: 我得到的错误是: 错误:未知提供程序:serviceBProvider 我该怎么做? 问题答案: 实际上,在AngularJS中,依赖注入使用“最后获胜”规则。因此

  • 本文向大家介绍AngularJS 单元测试服务,包括了AngularJS 单元测试服务的使用技巧和注意事项,需要的朋友参考一下 示例 服务编号 考试 跑!

  • 我不熟悉单元测试。参考google之后,我创建了一个测试类来测试我的控制器,如下所示: 我有以下控制器和服务类: 当我调试单元测试时,控制器中的p对象为null。我的状态是200,但不是预期的JSON响应 我错过了什么?

  • 我已经开始考虑在我的项目中围绕一些业务逻辑添加一些单元测试。 我想测试的第一个方法是服务层中的一个方法,它返回给定节点的子节点列表。 该方法如下所示: 我想象这样的测试方法是提供一个假树结构,然后测试提供节点是否返回正确的子节点。 ssdsContext是一个对象上下文。 我已经看到可以为提取和接口如何模拟ObjectContext或ObjectQuery 我还读到,as Entity Frame

  • 知道为什么@Context注入在单元测试时不起作用吗?

  • 我正在进行一个spring-boot项目,其中我有一个控制器,它调用服务方法并处理输出。 我正在使用spring MockMvc测试web层。在我的测试类中,我用Mockito.when()模拟了服务方法。但是当我调用相应的处理方法时,它不是调用被模仿的服务方法,而是返回一个空响应。 控制器 测试类 返回的响应是 请帮我解决这个问题。提前谢谢!