gpt4 book ai didi

java - 安卓测试 : Stubbing out Retrofit with Mockito

转载 作者:塔克拉玛干 更新时间:2023-11-02 18:52:29 26 4
gpt4 key购买 nike

在我的 MainActivity 中,我有一个名为 getAPI 的方法,它返回一个 OTBServiceWrapper。这用于设置调用 API 的改造。

在我的 MainActivityTest 文件中,我试图清除 getApi 方法正在进行的 new OTBService().getService() 调用所以我可以返回一个 MockedOTBService,它将客户端更改为返回 json 的自定义客户端。

如果我不得不在 MockedOTBService 中放置一个记录器,那么当前的实现将是 MockedOTBService 但也失败并调用真正的 api,这是不想要的我想参加考试。

我正在尝试使用 Mockito stub Retrofit API 调用并返回 json。我似乎无法理解为什么正在调用 stub 但没有 stub 有问题的方法。

注意事项:

  1. 我正在使用 ActivityInstrumentationTestCase2
  2. 我只进行一次测试
  3. 如果我添加一个 verify(mockedOTBService, atLeastOnce()).getService(); 表示它从未被调用。
  4. 如果我将 when...thenReturn 更改为使用 mMainActivity = spy(getActivity()),则不会发生任何变化,并且会调用真正的 API。<

Logcat 输出

Logger﹕ MockedOTBService was called // Mock is called
Logger﹕ Real OTBService was called // Real API is called
Logger﹕ MainActivity getAPI method class is "$Proxy1" // Mock is shown in MainActivity
Logger﹕ RealAPIResponse JSON Parsed ID: 266 // Real API response returned

真实流

MainActivity.onCreate() > OTBService.getService() > OTBServiceWrapper.createSearch(...)

尝试在测试中取得成就

MainActivity.onCreate() > MockedOTBService.getService() > OTBServiceWrapper.createSearch(...)

主 Activity .java

public class MainActivity extends Activity {
private OTBServiceWrapper serviceWrapper;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

getApi().createSearch(...)
}

public OTBServiceWrapper getApi() {
return new OTBService().getService();
}
}

OTBService.java

public class OTBService {
public OTBServiceWrapper getService() {
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint(Constants.API_URL)
.build();

return restAdapter.create(OTBServiceWrapper.class);
}
}

OTBServiceWrapper.java

public interface OTBServiceWrapper {
@POST(Constants.API_SEARCHES_POST_URL)
void createSearch(@Body Request request, Callback<Request.Response> callback);
}

主 Activity 测试.java

public class MainActivityTest extends ActivityInstrumentationTestCase2<MainActivity> {
private OTBService mMockedOTBService;
private MainActivity mMainActivity;
private View mSearchButton;

public MainActivityTest() { super(MainActivity.class); }

@Override
protected void setUp() throws Exception {
super.setUp();

setActivityInitialTouchMode(true);

System.setProperty("dexmaker.dexcache", getInstrumentation().getTargetContext().getCacheDir().getPath());

mMockedOTBService = mock(OTBService.class);
when(mMockedOTBService.getService()).thenReturn(new MockedOTBService(getInstrumentation().getContext()).getService());

mMainActivity = getActivity();

mSearchButton = mMainActivity.findViewById(R.id.AbSearchButton);
mYourHolidayButton = mMainActivity.findViewById(R.id.AbYourHolidayButton);
}

public void testButtonActions() {
TouchUtils.clickView(this, mSearchButton);
...
}
}

模拟OTBService.java

public class MockedOTBService {
private Context context;

public MockedOTBService(Context context) { this.context = context; }

public OTBServiceWrapper getService() {
RestAdapter restAdapter;

restAdapter = new RestAdapter.Builder()
.setClient(new LocalJsonClient(context))
.setEndpoint(Constants.API_TEST_URL)
.build();

return restAdapter.create(OTBServiceWrapper.class);
}
}

LocalJsonClient.java

@SuppressLint("DefaultLocale")
public class LocalJsonClient implements Client { ... }

构建.gradle

dependencies {
androidTestCompile 'com.google.dexmaker:dexmaker:1.0'
androidTestCompile 'com.google.dexmaker:dexmaker-mockito:1.0'
}

最佳答案

通过允许 Activity 设置服务来消除模拟您的请求的需要。

在您的 MainActivity 中,为服务创建一个类变量和一个类 setter 。它需要在类范围内,以防止在将服务设置为您想要的服务之前调用 OnCreate 方法。如果您还没有创建一个实例 getter 来设置服务。

在调用 getActivity() 之前的测试中,将服务设置为模拟服务。 (也许考虑将其移至支持对象)。

主 Activity .java

public class MainActivity extends Activity {
private static OTBServiceWrapper serviceWrapper;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

getServiceWrapper.createSearch(...)
}

public OTBServiceWrapper getServiceWrapper() {
if (serviceWrapper == null) {
MainActivity.setServiceWrapper(new OTBService().getService());
}

return serviceWrapper;
}

public static void setServiceWrapper(OTBServiceWrapper serviceWrapper) {
MainActivity.serviceWrapper = serviceWrapper;
}
}

MainActivityTest.java

public class MainActivityTest extends ActivityInstrumentationTestCase2<MainActivity> {
private MainActivity mMainActivity;

public MainActivityTest() { super(MainActivity.class); }

@Override
protected void setUp() throws Exception {
super.setUp();

setActivityInitialTouchMode(true);

MainActivity.setServiceWrapper(
new MockedOTBService(getInstrumentation().getContext()).getService()
);

mMainActivity = getActivity();
}
}

关于java - 安卓测试 : Stubbing out Retrofit with Mockito,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22920365/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com