单元测试:模拟改造中的NoSuchMethodError获取请求

时间:2016-08-17 16:03:43

标签: android unit-testing mockito retrofit junit4

当我只运行方法testInsert()时,测试完成没有问题,但是当我运行整个类时,我遇到了错误:

java.lang.NoSuchMethodError: com.dataart.kvarivoda.myapplication.api.PlacesApi.getNearbyPlaces(Ljava/lang/String;Ljava/lang/String;I)Lretrofit2/Call;

at GetPlacesTest.testLogin(GetPlacesTest.java:61)
....

改造@GET界面是:

public interface PlacesApi {
@GET("/maps/api/place/nearbysearch/json")
PlacesResults getNearbyPlaces(@Query("key") String key, @Query("location") String location, @Query("radius") int radius);
}

我的测试课程是:

public class GetPlacesTest extends ProviderTestCase2 {

PlacesApi mockApi;
EventBus mockEventBus;
PlacesApi api;

Cursor cursor;
String webApiKey;

public GetPlacesTest() {
    super(PlacesContentProvider.class, "com.example.myName.myapplication.database.PROVE");
}

public void setUp() throws Exception {
    super.setUp();
    setContext(InstrumentationRegistry.getTargetContext());
    //MockitoAnnotations.initMocks(this);
    mockApi = Mockito.mock(PlacesApi.class);
    mockEventBus = Mockito.mock(EventBus.class);
    webApiKey = getContext().getResources().getString(R.string.webApiKey);
    api = ((PlacesApp) getApplication()).getApi();
}

@Override
protected void tearDown() throws Exception {
    super.tearDown();
    if (cursor != null) {
        cursor.close();
    }
}

@Test
public void testInsert() throws Exception {
    PlacesResults results1 = loadResults("getplaces.json");

    Mockito.when(mockApi.getNearbyPlaces(eq("testkey"), Matchers.anyString(), Matchers.anyInt())).thenReturn(results1);

    GetPlacesAction action = new GetPlacesAction(getContext().getContentResolver(), mockEventBus, mockApi, "testkey");
    action.downloadPlaces();

    //check
    cursor = getContext().getContentResolver().query(PlacesContentProvider.getUri(DB.PlaceTable.DB_TABLE), null, null, null, null);
    assertEquals(2, cursor.getCount());

    cursor.moveToPosition(0);
    assertEquals("461d123aeb1c1648abdd5e535989d2bc518cf28e", getColumn(DB.PlaceTable.COLUMN_ID));
    assertEquals("Astral Tower & Residences", getColumn(DB.PlaceTable.COLUMN_TITLE));
    assertEquals(getImageUrl("CoQBcwAAAMUTbLLt7doNLiVSnpGryeIJLVdrDnMPcqs3uV84zfvDklrBr1uYxitVMEZWzTD40xkM923ak8HfRtoGiNdi32mqzP6sKB3lOYNbbOQeaHZ3bStClwhWO3507ryh4bODvEfXc-l42r7rFXFAg9GLSd7N2tqoOgLwzTLray0d1sixEhAZaZ2_ajvBieZvUuPA72d7GhQTtFtpqT8j7UBYSHvq9AuRsoRSig"), getColumn(DB.PlaceTable.COLUMN_IMAGE));
    assertEquals(locationToString(-33.868111), getColumn(DB.PlaceTable.COLUMN_LOCATION_LAT));
    assertEquals(locationToString(151.195219), getColumn(DB.PlaceTable.COLUMN_LOCATION_LNG));
}



private PlacesResults loadResults(String file) throws IOException {
    InputStream is = InstrumentationRegistry.getContext().getAssets().open(file);
    return new GsonBuilder().create().fromJson(new InputStreamReader(is), PlacesResults.class);
}

private String getImageUrl(String photoReference) {
    return new GoogleImagesUtil("testkey").getImageUrl(photoReference);
}

private String locationToString(double location) {
    return String.valueOf(LocationsUtil.locationToInteger(location));
}

private String getColumn(String column) {
    return cursor.getString(cursor.getColumnIndex(column));
}

private int getColumnInt(String column) {
    return cursor.getInt(cursor.getColumnIndex(column));
}
}

1 个答案:

答案 0 :(得分:1)

经过一番尝试后,我甚至无法编译并开始“找不到测试”错误。后来我发现课堂上有一些跑步配置,虽然我没有添加任何东西。我在这个答案之后删除了运行配置: https://stackoverflow.com/a/38190125/2574228

之后所有的错误都消失了。