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(响应);
}
}
目标:

  • getAlbums
    方法中模拟AlbumService,这样我就可以调用
    onSuccess()
    ,而不是从服务器获取数据,并将测试数据作为参数。是否可以在解析后获取列表,以便根据列表中的数据进行断言
  • 我不想将负责解析的代码转移到某个方法中,并将其公开。我的目的是了解如何处理这种情况
  • 如果这是TDD中需要注意的,那么就打开代码重构
  • 完整的解决方案或寻找两者的指针是值得赞赏的

  • mockito核心:2.2.9
  • junit:4.12

如果选择小型重构,则:

1)
新相册服务()移动到包级方法:

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();
    ...