我使用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调用。非常感谢。
我想你把这里的一些东西弄混了。在测试中,您似乎在测试服务,而不是存储库。服务需要被嘲笑,以便实际返回一些东西,而不是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()模拟了服务方法。但是当我调用相应的处理方法时,它不是调用被模仿的服务方法,而是返回一个空响应。 控制器 测试类 返回的响应是 请帮我解决这个问题。提前谢谢!