Java 单元测试用例的模拟网络响应
我正在尝试为Java 单元测试用例的模拟网络响应,java,android,unit-testing,junit,mockito,Java,Android,Unit Testing,Junit,Mockito,我正在尝试为AlbumsController创建一个测试用例,它从网络中获取数据并对其进行解析 AlbumService:负责网络呼叫和获取数据(假设它可以是执行某些异步任务并相应地进行回调的任何东西,以避免特定于“服务器”的模拟解决方案) 公共类相册控制器{ public void getAlbums(最终服务回调相册服务回调){ new AlbumsService().fetchAlbums(new ServiceCallback()){ @凌驾 成功时公共无效(网络响应){ //解析响应
AlbumsController
创建一个测试用例,它从网络中获取数据并对其进行解析
AlbumService
:负责网络呼叫和获取数据(假设它可以是执行某些异步任务并相应地进行回调的任何东西,以避免特定于“服务器”的模拟解决方案)
公共类相册控制器{
public void getAlbums(最终服务回调相册服务回调){
new AlbumsService().fetchAlbums(new ServiceCallback()){
@凌驾
成功时公共无效(网络响应){
//解析响应
}
@凌驾
public void onFailure(网络响应错误){
//为失败做点什么
}
});
}
公共类AlbumControllerTest{
@嘲弄
私有服务回调服务回调;
@俘虏
私人说话人;
@俘虏
私有参数捕获器网络响应捕获器;
@以前
公共void init(){
initMocks(this);
}
@试验
public void parseAlbums\u EmptyList\u ReturnsTrue(){
//以下是我尝试的不同方法,但迄今为止没有成功。
AlbumsController AlbumsController=新的AlbumsController();
albumsController.getAlbums(albumsWrapper.capture());
NetworkResponse=新的NetworkResponse();
networkResponseArgumentCaptor.capture();
networkResponseArgumentCaptor.getValue().onSuccess(响应);
}
}
目标:
- 在
方法中模拟AlbumService,这样我就可以调用getAlbums
,而不是从服务器获取数据,并将测试数据作为参数。是否可以在解析后获取列表,以便根据列表中的数据进行断言onSuccess()
- 我不想将负责解析的代码转移到某个方法中,并将其公开。我的目的是了解如何处理这种情况
- 如果这是TDD中需要注意的,那么就打开代码重构
- 完整的解决方案或寻找两者的指针是值得赞赏的
- mockito核心:2.2.9
- junit:4.12
新相册服务()移动到包级方法:
AlbumService createAlbumService(){
return new AlbumService();
}
...
public void getAlbums(final ServiceCallback<AlbumsWrapper> albumsServiceCallback) {
createAlbumService().fetchAlbums(new ServiceCallback<NetworkResponse>()
3)使createAlbumService()方法返回模拟:
@Test
public void parseAlbums_EmptyList_ReturnsTrue() {
doReturn(albumServiceMock).when(albumControllerSpy).createAlbumService();
...
可能值得一看okhttp,让它返回您期望的JSON
@Spy
private AlbumsController albumsControllerSpy = new AlbumController();
@Mock
private AlbumService albumServiceMock;
@Test
public void parseAlbums_EmptyList_ReturnsTrue() {
doReturn(albumServiceMock).when(albumControllerSpy).createAlbumService();
...