【问题标题】:Mocking Network response for unit test case模拟单元测试用例的网络响应
【发布时间】:2019-02-19 14:17:52
【问题描述】:

我正在尝试为AlbumsController 创建一个测试用例,它从网络中获取数据并对其进行解析。

AlbumService:负责网络调用和获取数据。 (假设它可以是任何执行一些异步任务并相应地给出回调以避免“服务器”特定的模拟解决方案)

public class AlbumsController {

    public void getAlbums(final ServiceCallback<AlbumsWrapper> albumsServiceCallback) {

        new AlbumsService().fetchAlbums(new ServiceCallback<NetworkResponse>() {
            @Override
            public void onSuccess(NetworkResponse response) {
                // parse response
            }

            @Override
            public void onFailure(NetworkResponse error) {
                // do something for Failure
            }
        });
    }



public class AlbumControllerTest {

    @Mock
    private ServiceCallback<NetworkResponse> serviceCallback;

    @Captor
    private ArgumentCaptor<ServiceCallback<AlbumsWrapper>> albumsWrapper;

    @Captor
    private  ArgumentCaptor<ServiceCallback<NetworkResponse>> networkResponseArgumentCaptor;

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

    @Test
    public void parseAlbums_EmptyList_ReturnsTrue() {

// below are different ways I am trying with no success so far.
        AlbumsController albumsController = new AlbumsController();
        albumsController.getAlbums(albumsWrapper.capture());


        NetworkResponse response = new NetworkResponse();
        networkResponseArgumentCaptor.capture();
        networkResponseArgumentCaptor.getValue().onSuccess(response);
    }
}

目标:

  • getAlbums 方法中模拟AlbumService,这样我就可以使用我的测试数据作为参数调用onSuccess(),而不是从服务器获取数据。是否可以解析后获取列表,以便我可以根据列表中的数据assert
  • 我不想将负责解析的代码移至某个方法并将其公开。我的目的是了解如何处理这种情况。
  • 如果在 TDD 中需要处理代码重构,则打开该代码重构。
  • 感谢您提供完整的解决方案或寻找两者的指针。

  • mockito-core:2.2.9
  • junit:4.12

【问题讨论】:

  • 可能值得看看 okhttp 的 MockWebServer 并让它返回您期望的 JSON

标签: java android unit-testing junit mockito


【解决方案1】:

如果小重构是选项,那么:

1)new AlbumsService() 移至包级方法:

AlbumService createAlbumService(){
    return new AlbumService();
}

...

public void getAlbums(final ServiceCallback<AlbumsWrapper> albumsServiceCallback) {

    createAlbumService().fetchAlbums(new ServiceCallback<NetworkResponse>()

package 可见性就足够了,因为测试类将与AlbumController 在同一个包中。

2) 窥探AlbumController

@Spy
private AlbumsController albumsControllerSpy = new AlbumController();

@Mock 
private AlbumService albumServiceMock;

3)createAlbumService() 方法返回你的模拟:

@Test
public void parseAlbums_EmptyList_ReturnsTrue() {

    doReturn(albumServiceMock).when(albumControllerSpy).createAlbumService();
    ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-27
    • 2021-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-25
    • 2015-04-08
    相关资源
    最近更新 更多