android 接口单元测试,android – 单元测试使用Mockito进行改造api调用 – ArgumentCaptor...

请原谅我,如果我的问题看起来重复,但我没有得到如何测试改造API调用.

应用程序级别的build.gradle

dependencies {

compile fileTree(dir: 'libs', include: ['*.jar'])

androidTestCompile("com.android.support.test.espresso:espresso-core:$rootProject.ext.expressoVersion", {

exclude group: 'com.android.support', module: 'support-annotations'

})

compile "com.android.support:appcompat-v7:$rootProject.ext.supportLibraryVersion"

compile "com.jakewharton:butterknife:$rootProject.ext.butterKnifeVersion"

annotationProcessor "com.jakewharton:butterknife-compiler:$rootProject.ext.butterKnifeVersion"

// Dependencies for local unit tests

testCompile "junit:junit:$rootProject.ext.junitVersion"

testCompile "org.mockito:mockito-all:$rootProject.ext.mockitoVersion"

testCompile "org.hamcrest:hamcrest-all:$rootProject.ext.hamcrestVersion"

testCompile "org.powermock:powermock-module-junit4:$rootProject.ext.powerMockito"

testCompile "org.powermock:powermock-api-mockito:$rootProject.ext.powerMockito"

compile "com.android.support.test.espresso:espresso-idling-resource:$rootProject.ext.espressoVersion"

// retrofit, gson

compile "com.google.code.gson:gson:$rootProject.ext.gsonVersion"

compile "com.squareup.retrofit2:retrofit:$rootProject.ext.retrofitVersion"

compile "com.squareup.retrofit2:converter-gson:$rootProject.ext.retrofitVersion"

}

项目级的build.gradle有这个额外的内容

//在一个地方定义版本

ext {

// Sdk and tools

minSdkVersion = 15

targetSdkVersion = 25

compileSdkVersion = 25

buildToolsVersion = '25.0.2'

supportLibraryVersion = '23.4.0'

junitVersion = '4.12'

mockitoVersion = '1.10.19'

powerMockito = '1.6.2'

hamcrestVersion = '1.3'

runnerVersion = '0.5'

rulesVersion = '0.5'

espressoVersion = '2.2.2'

gsonVersion = '2.6.2'

retrofitVersion = '2.0.2'

butterKnifeVersion = '8.5.1'

expressoVersion = '2.2.2'

}

主要活动

public class MainActivity extends AppCompatActivity implements MainView {

@BindView(R.id.textViewApiData)

TextView mTextViewApiData;

@BindView(R.id.progressBarLoading)

ProgressBar mProgressBarLoading;

private MainPresenter mMainPresenter;

@Override

protected void onCreate(final Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

ButterKnife.bind(this);

initializeComponents();

}

private void initializeComponents() {

mMainPresenter = new MainPresenter(this);

mMainPresenter.presentDataFromApi();

}

@Override

public void onResponseReceived(final String response) {

mTextViewApiData.setText(response);

}

@Override

public void one rrorReceived(final String message) {

mTextViewApiData.setText(message);

}

@Override

public void showProgressDialog(final boolean enableProgressDialog) {

mProgressBarLoading.setVisibility(enableProgressDialog ? View.VISIBLE : View.GONE);

}

}

的MainView

public interface MainView {

void onResponseReceived(String response);

void one rrorReceived(String message);

void showProgressDialog(boolean enableProgressDialog);

}

ApiClient

public class ApiClient {

private static Retrofit sRetrofit;

public static Retrofit getInstance() {

if (sRetrofit == null) {

sRetrofit = new Retrofit.Builder()

.baseUrl(Constants.Urls.BASE_URL)

.addConverterFactory(GsonConverterFactory.create())

.build();

}

return sRetrofit;

}

}

主持人

public class MainPresenter {

private final MainView mMainView;

private final Call> mCallListUserResponse;

public MainPresenter(final MainView mainView) {

this.mMainView = mainView;

final ApiInterface apiInterface = ApiClient.getInstance().create(ApiInterface.class);

mCallListUserResponse = apiInterface.getUsers();

}

public void presentDataFromApi() {

mMainView.showProgressDialog(true);

mCallListUserResponse.enqueue(new Callback>() {

@Override

public void onResponse(final Call> call,

final Response> response) {

mMainView.onResponseReceived(Constants.DummyData.SUCCESS);

mMainView.showProgressDialog(false);

}

@Override

public void onFailure(final Call> call, final Throwable t) {

mMainView.onErrorReceived(Constants.DummyData.ERROR);

mMainView.showProgressDialog(false);

}

});

}

}

ApiInterface

public interface ApiInterface {

@GET(Constants.Urls.USERS)

Call> getUsers();

}

常量

public class Constants {

public class Urls {

public static final String BASE_URL = "https://jsonplaceholder.typicode.com";

public static final String USERS = "/users";

}

}

这就是我想要做的事情,但它不起作用.测试用例现在将通过,因为我评论了最后一行中的3行.取消注释这些行后,您可以查看错误.

测试用例

public class MainPresenterTest {

@InjectMocks

private MainPresenter mMainPresenter;

@Mock

private MainView mMockMainView;

@Mock

private Call> mUserResponseCall;

@Captor

private ArgumentCaptor>> mArgumentCaptorUserResponse;

@Before

public void setUp() throws Exception {

MockitoAnnotations.initMocks(this);

}

@Test

public void presentDataFromApiTest() throws Exception {

mMainPresenter.presentDataFromApi();

verify(mMockMainView).showProgressDialog(true);

// verify(mUserResponseCall).enqueue(mArgumentCaptorUserResponse.capture());

// verify(mMockMainView).onResponseReceived(Constants.DummyData.SUCCESS);

// verify(mMockMainView).showProgressDialog(false);

}

}

日志

Wanted but not invoked:

mUserResponseCall.enqueue(

);

-> at com.example.ranaranvijaysingh.testingdemo.presenters.MainPresenterTest.presentDataFromApiTest(MainPresenterTest.java:69)

Actually, there were zero interactions with this mock.

解决方法:

您的代码在语法上看起来正确.但是,我怀疑@InjectMock无法将模拟对象注入最终的实例变量.当您调用mMainPresenter.presentDataFromApi()时,下面的变量可能被用作实例:

private final Call> mCallListUserResponse;

您应该尝试将mock变量手动注入此类并分配给mCallListUserResponse以便能够从mockito实例中获取.

可能值得尝试以下步骤:

>将MainPresenter中的变量mCallListUserResponse设为非final.

>在MainPresenter类中添加一个方法,如下所示:

void setUserResponseCall(Call> userResponse){

mCallListUserResponse = userResponse;

}

>现在在Test类中执行以下操作:

修改您的测试,如下所示

@Test

public void presentDataFromApiTest() throws Exception {

//Set mock instance of the user response

mMainPresenter.setUserResponseCall(mUserResponseCall);

//real object call to presentDataFromApi();

mMainPresenter.presentDataFromApi();

verify(mMockMainView).showProgressDialog(true);

verify(mUserResponseCall).enqueue(mArgumentCaptorUserResponse.capture());

}

希望能帮助到你.

标签:android,mockito,retrofit2

来源: https://codeday.me/bug/20190627/1308222.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值