如何为android的API编写单元测试用例?

如何为android的API编写单元测试用例?,android,api,android-asynctask,android-volley,retrofit,Android,Api,Android Asynctask,Android Volley,Retrofit,我想为我的代码编写一个单元测试用例,在开发和构建APK之前,还需要通过所有单元测试用例。请建议我。编写测试用例需要遵循一些架构,如MVP或MVVM,还需要使用Junit和Mockito测试框架,您可以找到示例 这里有一个简单的例子,也许它可以帮助你。在这里,我使用网络改造 活动 package com.ram.com.mvp_示例; 导入android.support.v7.app.AppActivity; 导入android.os.Bundle; 导入android.support.v7.wi

我想为我的代码编写一个单元测试用例,在开发和构建APK之前,还需要通过所有单元测试用例。请建议我。

编写测试用例需要遵循一些架构,如MVP或MVVM,还需要使用Junit和Mockito测试框架,您可以找到示例

这里有一个简单的例子,也许它可以帮助你。在这里,我使用网络改造

活动

package com.ram.com.mvp_示例;
导入android.support.v7.app.AppActivity;
导入android.os.Bundle;
导入android.support.v7.widget.LinearLayoutManager;
导入android.support.v7.widget.RecyclerView;
导入android.view.view;
导入android.widget.ProgressBar;
导入android.widget.Toast;
导入com.ram.com.mvp_sample.modal.RemoteRepository;
导入com.ram.com.mvp_sample.modal.Repository;
导入com.ram.com.mvp_sample.modal.pojo.Example;
导入java.util.List;
/**
*提供通过电子邮件/密码登录的登录屏幕。
*/
公共类ImageListActivity扩展AppCompatActivity实现契约。查看{
私人合同。主持人;
私人ProgressBar mProgressView;
私有回收视图图像列表;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u image\u列表);
presenter=新的presenter(这是Repository.getInstance(RemoteRepository.getInstance());
mProgressView=findviewbyd(R.id.login\u progress);
imageList=findViewById(R.id.image\u列表);
getImageList(新的AppNetworkStatus(此));
}
@凌驾
公共void showProgressBar(布尔显示){
mProgressView.setVisibility(显示?视图。可见:视图。消失);
}
@凌驾
公共作废showImageList(列表示例){
ImageListAdapter=新ImageListAdapter(示例);
LinearLayoutManager layoutManager=新的LinearLayoutManager(此);
setLayoutManager(layoutManager);
设置适配器(适配器);
}
@凌驾
公共错误(对象错误代码){
Toast.makeText(this,errorCode.toString(),Toast.LENGTH_LONG).show();
}
@凌驾
public void setPresenter(Contract.Presenter-Presenter){
this.presenter=演示者;
}
}
Repository类:它将与RemoteRepository交互

package com.ram.com.mvp_示例;
导入com.ram.com.mvp_sample.modal.DataSource;
导入com.ram.com.mvp_sample.modal.Repository;
导入com.ram.com.mvp_sample.modal.pojo.Example;
导入java.util.List;
公共类Presenter实现契约。Presenter{
私人合同。视图;
私有存储库;
公共演示者(Contract.View视图、存储库storesRepository){
this.view=视图;
this.repository=storesRepository;
this.view.setPresenter(this);
}
@凌驾
公共无效getImageList(网络状态NetworkStatus){
view.showProgressBar(true);
repository.getList(networkStatus,new DataSource.OnResponseCallBackListener(){
@凌驾
成功时公开作废(列表数据){
view.showProgressBar(假);
视图。showImageList(数据);
}
@凌驾
public void onError(对象错误){
view.showProgressBar(假);
视图。错误(错误);
}
});
}
@凌驾
公开作废开始(){
}
}
RemoteRepository类:它将直接在此处进行修改

package com.ram.com.mvp_sample.modal;
导入com.ram.com.mvp_sample.APIClient;
导入com.ram.com.mvp_sample.api接口;
导入com.ram.com.mvp_sample.NetworkStatus;
导入com.ram.com.mvp_sample.modal.pojo.Example;
导入java.util.List;
2.电话;;
2.回拨;
2.回应;;
公共类RemoteRepository实现了数据源{
私有静态RemoteRepository实例=null;
专用远程存储库(){
}
公共静态RemoteRepository getInstance(){
if(实例==null){
实例=新的RemoteRepository();
}
返回实例;
}
@凌驾
public void getList(NetworkStatus networkStats,final OnResponseCallBackListener OnResponseCallBackListener){
ApiInterface ApiInterface=APIClient.getClient().create(ApiInterface.class);
调用call1=apinterface.getImageList();
call1.enqueue(新回调(){
@凌驾
公共void onResponse(调用、响应){
onResponseCallBackListener.onSuccess(response.body());
}
@凌驾
失败时公共无效(调用调用,可丢弃的t){
onResponseCallBackListener.onError(t.toString());
}
});
}
}
Presenter类:Presenter负责与存储库和视图通信

package com.ram.com.mvp_示例;
导入com.ram.com.mvp_sample.modal.DataSource;
导入com.ram.com.mvp_sample.modal.Repository;
导入com.ram.com.mvp_sample.modal.pojo.Example;
导入java.util.List;
公共类Presenter实现契约。Presenter{
私人合同。视图;
私有存储库;
公共演示者(Contract.View视图、存储库storesRepository){
this.view=视图;
this.repository=storesRepository;
this.view.setPresenter(this);
}
@凌驾
公共无效getImageList(网络状态NetworkStatus){
view.showProgressBar(true);
repository.getList(networkStatus,new DataSource.OnResponseCallBackListener(){
@凌驾
成功时公开作废(列表数据){
view.showProgressBar(假);
视图。showImageList(数据);
}
@凌驾
public void onError(对象错误){
view.showProgressBar(假);
视图。错误(错误);
}
});
}
@凌驾
公开作废开始(){
}
}
演示者类的测试用例

package com.ram.com.mvp_示例;
导入com.ram.com.mvp_sample.modal.Da
package com.ram.com.mvp_sample;

import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.ProgressBar;
import android.widget.Toast;

import com.ram.com.mvp_sample.modal.RemoteRepository;
import com.ram.com.mvp_sample.modal.Repository;
import com.ram.com.mvp_sample.modal.pojo.Example;

import java.util.List;

/**
 * A login screen that offers login via email/password.
 */
public class ImageListActivity extends AppCompatActivity implements Contract.View {


    private Contract.Presenter presenter;
    private ProgressBar mProgressView;
    private RecyclerView imageList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_image_list);
        presenter = new Presenter(this, Repository.getInstance(RemoteRepository.getInstance()));
        mProgressView = findViewById(R.id.login_progress);
        imageList = findViewById(R.id.image_list);
        presenter.getImageList(new AppNetworkStatus(this));

    }


    @Override
    public void showProgressBar(boolean show) {
        mProgressView.setVisibility(show ? View.VISIBLE : View.GONE);
    }

    @Override
    public void showImageList(List<Example> example) {
        ImageListAdapter adapter = new ImageListAdapter(example);
        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        imageList.setLayoutManager(layoutManager);
        imageList.setAdapter(adapter);
    }

    @Override
    public void showError(Object errorCode) {
        Toast.makeText(this, errorCode.toString(), Toast.LENGTH_LONG).show();
    }

    @Override
    public void setPresenter(Contract.Presenter presenter) {
        this.presenter = presenter;
    }
}
package com.ram.com.mvp_sample;

import com.ram.com.mvp_sample.modal.DataSource;
import com.ram.com.mvp_sample.modal.Repository;
import com.ram.com.mvp_sample.modal.pojo.Example;

import java.util.List;

public class Presenter implements Contract.Presenter {

private Contract.View view;
private Repository repository;

public Presenter(Contract.View view, Repository storesRepository) {
    this.view = view;
    this.repository = storesRepository;
    this.view.setPresenter(this);
}

@Override
public void getImageList(NetworkStatus networkStatus) {
    view.showProgressBar(true);
    repository.getList(networkStatus, new DataSource.OnResponseCallBackListener() {
        @Override
        public void onSuccess(List<Example> data) {
            view.showProgressBar(false);
            view.showImageList(data);
        }

        @Override
        public void onError(Object error) {
            view.showProgressBar(false);
            view.showError(error);
        }
    });
}

@Override
public void start() {

}
}
 package com.ram.com.mvp_sample.modal;

import com.ram.com.mvp_sample.APIClient;
import com.ram.com.mvp_sample.ApiInterface;
import com.ram.com.mvp_sample.NetworkStatus;
import com.ram.com.mvp_sample.modal.pojo.Example;

import java.util.List;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

public class RemoteRepository implements DataSource {

private static RemoteRepository INSTANCE = null;

private RemoteRepository() {
}

public static RemoteRepository getInstance() {
    if (INSTANCE == null) {
        INSTANCE = new RemoteRepository();
    }
    return INSTANCE;
}

@Override
public void getList(NetworkStatus networkStats, final OnResponseCallBackListener onResponseCallBackListener) {

    ApiInterface apiInterface = APIClient.getClient().create(ApiInterface.class);

    Call<List<Example>> call1 = apiInterface.getImageList();
    call1.enqueue(new Callback<List<Example>>() {
        @Override
        public void onResponse(Call<List<Example>> call, Response<List<Example>> response) {
            onResponseCallBackListener.onSuccess(response.body());

        }

        @Override
        public void onFailure(Call<List<Example>> call, Throwable t) {
            onResponseCallBackListener.onError(t.toString());

        }
    });
}
}
package com.ram.com.mvp_sample;

import com.ram.com.mvp_sample.modal.DataSource;
import com.ram.com.mvp_sample.modal.Repository;
import com.ram.com.mvp_sample.modal.pojo.Example;

import java.util.List;

public class Presenter implements Contract.Presenter {

private Contract.View view;
private Repository repository;

public Presenter(Contract.View view, Repository storesRepository) {
    this.view = view;
    this.repository = storesRepository;
    this.view.setPresenter(this);
}

@Override
public void getImageList(NetworkStatus networkStatus) {
    view.showProgressBar(true);
    repository.getList(networkStatus, new DataSource.OnResponseCallBackListener() {
        @Override
        public void onSuccess(List<Example> data) {
            view.showProgressBar(false);
            view.showImageList(data);
        }

        @Override
        public void onError(Object error) {
            view.showProgressBar(false);
            view.showError(error);
        }
    });
}

@Override
public void start() {

}
}
package com.ram.com.mvp_sample;

import com.ram.com.mvp_sample.modal.DataSource;
import com.ram.com.mvp_sample.modal.Repository;
import com.ram.com.mvp_sample.modal.pojo.Example;

import org.junit.Before;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import org.mockito.ArgumentMatchers;
import org.mockito.Captor;
import org.mockito.InOrder;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;

import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

public class PresenterTest {

private Presenter presenter;

@Mock
private Repository repository;

@Mock
private Contract.View view;

@Mock
private NetworkStatus networkStatus;

@Captor
private ArgumentCaptor<NetworkStatus> networkStatusArgumentCaptor;

@Captor
private ArgumentCaptor<DataSource.OnResponseCallBackListener> callBackListenerArgumentCaptor;

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

    presenter = new Presenter(view, repository);
}

// Positive test
@Test
public void getImageList() {

    when(networkStatus.isOnline()).thenReturn(true);

    presenter.getImageList(networkStatus);

    verify(repository).getList(networkStatusArgumentCaptor.capture(), callBackListenerArgumentCaptor.capture());
    callBackListenerArgumentCaptor.getValue().onSuccess(ArgumentMatchers.<Example>anyList());

    InOrder inOrder = Mockito.inOrder(view);
    inOrder.verify(view).showProgressBar(true);
    inOrder.verify(view).showProgressBar(false);
    inOrder.verify(view).showImageList(ArgumentMatchers.<Example>anyList());

}

// Negative test
@Test
public void getImageListNetworkError() {

    when(networkStatus.isOnline()).thenReturn(false);

    presenter.getImageList(networkStatus);

    verify(repository).getList(networkStatusArgumentCaptor.capture(), callBackListenerArgumentCaptor.capture());
    callBackListenerArgumentCaptor.getValue().onError(anyString());

    InOrder inOrder = Mockito.inOrder(view);
    inOrder.verify(view).showProgressBar(true);
    inOrder.verify(view).showProgressBar(false);
    inOrder.verify(view).showError(anyString());

}

}
package com.ram.com.mvp_sample;

import com.ram.com.mvp_sample.modal.DataSource;
import com.ram.com.mvp_sample.modal.RemoteRepository;
import com.ram.com.mvp_sample.modal.Repository;
import com.ram.com.mvp_sample.modal.pojo.Example;

import org.junit.Before;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import org.mockito.ArgumentMatchers;
import org.mockito.Captor;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;

import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

public class RepositoryTest {

    private Repository repository;

    @Mock
    private RemoteRepository remoteRepository;

    @Mock
    private NetworkStatus networkStatus;

    @Captor
    private ArgumentCaptor<NetworkStatus> networkStatusArgumentCaptor;

    @Mock
    private DataSource.OnResponseCallBackListener callBackListener;
    @Captor
    private ArgumentCaptor<DataSource.OnResponseCallBackListener> callBackListenerArgumentCaptor;

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
        repository = Repository.getInstance(remoteRepository);
    }

    @Test
    public void getImageList() {

        when(networkStatus.isOnline()).thenReturn(true);

        repository.getList(networkStatus, callBackListener);
        verify(remoteRepository).getList(networkStatusArgumentCaptor.capture(), callBackListenerArgumentCaptor.capture());
        callBackListenerArgumentCaptor.getValue().onSuccess(ArgumentMatchers.<Example>anyList());
        Mockito.verify(callBackListener).onSuccess(ArgumentMatchers.<Example>anyList());

        callBackListenerArgumentCaptor.getValue().onError("Some Error");
        Mockito.verify(callBackListener).onError("Some Error");

    }

}
    // required if you want to use Mockito for unit tests
    testCompile 'org.mockito:mockito-core:2.7.22'
    // required if you want to use Mockito for Android tests
    androidTestCompile 'org.mockito:mockito-android:2.7.22'