Android junit:android.net.Uri和Builder中的方法方案Not Mocked

Kar*_*lin 3 java junit android unit-testing

我正在尝试学习如何在Android中进行单元测试,而我却遇到了这个特殊问题.我搜索了以前的SO帖子,但没有一个与此错误相关.我得到了这个例外:

java.lang.RuntimeException:android.net.Uri $ Builder中的方法方案没有被模拟.有关详细信息,请参阅http://g.co/androidstudio/not-mocked.

为什么说Uri.Builder的方法"方案"需要被嘲笑?谢谢!

MovieDBAPITest.java

package com.karljamoralin.popularmovies;

import org.junit.Test;
import static org.junit.Assert.assertEquals;

public class MovieDBAPITest {

    MovieDBAPI movieDBAPI = new MovieDBAPI();

    @Test
    public void URLValidator() {
        assertEquals("https://api.themoviedb.org/3/movie/top_rated?api_key=test&language=en-US",
                movieDBAPI.buildUri("top_rated").toString());
    }

    @Test
    public void test() {
        assertEquals("a", movieDBAPI.test());
    }

}
Run Code Online (Sandbox Code Playgroud)

MovieDBAPI.java

package com.karljamoralin.popularmovies;

import android.net.Uri;
import android.os.AsyncTask;
import android.util.Log;

public class MovieDBAPI extends AsyncTask<String, Void, Void> {

    final String TAG = getClass().getSimpleName();

    @Override
    protected Void doInBackground(String... params) {

        Uri uri = buildUri(params[0]);

        Log.v(TAG, uri.toString());

        //Connect to URL

        //Get string input

        //Parse string input

        //Return M

        return null;
    }

    @Override
    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);
    }

    Uri buildUri(String mode) {

        final String SCHEME = "https";
        final String AUTHORITY = "api.themoviedb.org";
        final String PATH1 = "3";
        final String PATH2 = "movie";
        final String API_KEY = "movie";
        final String LANGUAGE = "language";

        Uri.Builder uriBuilder = new Uri.Builder();
        uriBuilder.scheme(SCHEME);
        uriBuilder.authority(AUTHORITY);
        uriBuilder.appendPath(PATH1);
        uriBuilder.appendPath(PATH2);
        uriBuilder.appendPath(mode);
        uriBuilder.appendQueryParameter(API_KEY, "test");
        uriBuilder.appendQueryParameter(LANGUAGE, "en-US");

        return uriBuilder.build();

    }

    String test() {
        return "a";
    }

}
Run Code Online (Sandbox Code Playgroud)

Fil*_*dio 6

是的,这种测试很糟糕的Android SDK.该Uri班是不是在dev的罐子实施.

我的建议是为这些情况制作包装类,并在测试中使用这些包装器.其他可能性是使用RobolectricAndroid Instrumentation Tests.