如何在Android单元测试中用模拟数据填充适配器? [英] How to fill adapter with mock data in unit test on Android?

查看:141
本文介绍了如何在Android单元测试中用模拟数据填充适配器?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的应用程序中,我从服务器获取一些数据并显示到RecyslerView中.
我可以获取数据并填充adapter并显示到RecyclerView中,但是我想用 Mockito Test 为此编写Test,然后将adapter填充到RecyclerView中.

我将此链接用于json: https://api.learn2crack .com/android/jsonandroid/

我写下面的代码,但是我不知道如何为此写 Test .

我的活动"课程:

public class MainActivity extends AppCompatActivity {

    private RecyclerView list;
    private Context context;
    private ApiServices apiServices;
    private List<Android> model = new ArrayList<>();
    private RecyclerAdapter adapter;

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

        context = this;
        apiServices = ApiClient.getClient().create(ApiServices.class);
        list = findViewById(R.id.list);
        list.setLayoutManager(new LinearLayoutManager(context));
        list.setHasFixedSize(true);
        adapter = new RecyclerAdapter(model);
        list.setAdapter(adapter);

        Call<AndroidResponse> call = apiServices.getAndroid();
        call.enqueue(new Callback<AndroidResponse>() {
            @Override
            public void onResponse(Call<AndroidResponse> call, Response<AndroidResponse> response) {
                if (response.isSuccessful()) {
                    if (response.body() != null) {
                        model.clear();
                        model.addAll(response.body().getAndroid());
                        adapter.notifyDataSetChanged();
                    }
                }
            }

            @Override
            public void onFailure(Call<AndroidResponse> call, Throwable t) {

            }
        });
    }
}

我的适配器类:

public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder> {
    private List<Android> model;
    public RecyclerAdapter(List<Android> model) {
        this.model = model;
    }
    @NonNull
    @Override
    public RecyclerAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_list, parent, false);
        return new ViewHolder(view);
    }
    @Override
    public void onBindViewHolder(@NonNull RecyclerAdapter.ViewHolder holder, int position) {
        holder.name.setText(model.get(position).getName());
        holder.version.setText(model.get(position).getVer());
        holder.api.setText(model.get(position).getApi());
    }
    @Override
    public int getItemCount() {
        return model.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        private TextView name, version, api;
        public ViewHolder(View itemView) {
            super(itemView);

            name = itemView.findViewById(R.id.rowName);
            version = itemView.findViewById(R.id.rowVersion);
            api = itemView.findViewById(R.id.rowApi);
        }
    }
}

我的测试班级:

@RunWith(AndroidJUnit4.class)
public class MainActivityTest extends InstrumentationTestCase {

    @Rule
    public ActivityTestRule<MainActivity> activityTest = new ActivityTestRule<>(MainActivity.class, true, false);
    private MockWebServer mockWebServer;

    @Before
    public void setUp() throws Exception {
        super.setUp();
        mockWebServer = new MockWebServer();
        mockWebServer.start();
        injectInsrumentation(InstrumentationRegistry.getInstrumentation());
        AppConstants.BASE_URL = mockWebServer.url("/").toString();
    }

    @Test
    public void setupAndroidListAdapterTest() throws Exception {

    }

    @After
    public void tearDown() throws Exception {
        mockWebServer.shutdown();
    }
}

我在 json 上方保存了asset文件夹.

我不知道如何在setupAndroidListAdapterTest()中编写测试以填充adapter并在recyclerView中显示模拟数据.

我该怎么办?

解决方案

模拟此方法以用假数据model.addAll(response.body().getAndroid());

填充模型

In my application I get some data from server and show into RecyslerView.
I can get data and fill adapter and show into RecyclerView, but I want write Test for this with Mockito Test and fill adapter for show into RecyclerView.

I use this link for json : https://api.learn2crack.com/android/jsonandroid/

I write below codes but I don't know how can I write Test for this.

My Activity class :

public class MainActivity extends AppCompatActivity {

    private RecyclerView list;
    private Context context;
    private ApiServices apiServices;
    private List<Android> model = new ArrayList<>();
    private RecyclerAdapter adapter;

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

        context = this;
        apiServices = ApiClient.getClient().create(ApiServices.class);
        list = findViewById(R.id.list);
        list.setLayoutManager(new LinearLayoutManager(context));
        list.setHasFixedSize(true);
        adapter = new RecyclerAdapter(model);
        list.setAdapter(adapter);

        Call<AndroidResponse> call = apiServices.getAndroid();
        call.enqueue(new Callback<AndroidResponse>() {
            @Override
            public void onResponse(Call<AndroidResponse> call, Response<AndroidResponse> response) {
                if (response.isSuccessful()) {
                    if (response.body() != null) {
                        model.clear();
                        model.addAll(response.body().getAndroid());
                        adapter.notifyDataSetChanged();
                    }
                }
            }

            @Override
            public void onFailure(Call<AndroidResponse> call, Throwable t) {

            }
        });
    }
}

My Adapter class :

public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder> {
    private List<Android> model;
    public RecyclerAdapter(List<Android> model) {
        this.model = model;
    }
    @NonNull
    @Override
    public RecyclerAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_list, parent, false);
        return new ViewHolder(view);
    }
    @Override
    public void onBindViewHolder(@NonNull RecyclerAdapter.ViewHolder holder, int position) {
        holder.name.setText(model.get(position).getName());
        holder.version.setText(model.get(position).getVer());
        holder.api.setText(model.get(position).getApi());
    }
    @Override
    public int getItemCount() {
        return model.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        private TextView name, version, api;
        public ViewHolder(View itemView) {
            super(itemView);

            name = itemView.findViewById(R.id.rowName);
            version = itemView.findViewById(R.id.rowVersion);
            api = itemView.findViewById(R.id.rowApi);
        }
    }
}

My Test class :

@RunWith(AndroidJUnit4.class)
public class MainActivityTest extends InstrumentationTestCase {

    @Rule
    public ActivityTestRule<MainActivity> activityTest = new ActivityTestRule<>(MainActivity.class, true, false);
    private MockWebServer mockWebServer;

    @Before
    public void setUp() throws Exception {
        super.setUp();
        mockWebServer = new MockWebServer();
        mockWebServer.start();
        injectInsrumentation(InstrumentationRegistry.getInstrumentation());
        AppConstants.BASE_URL = mockWebServer.url("/").toString();
    }

    @Test
    public void setupAndroidListAdapterTest() throws Exception {

    }

    @After
    public void tearDown() throws Exception {
        mockWebServer.shutdown();
    }
}

I saved above json into asset folder.

I don't know how can I write test into setupAndroidListAdapterTest() for fill adapter and show mock data into recyclerView.

How can I do it?

解决方案

Mock this Method to fill your Model with fake Data model.addAll(response.body().getAndroid());

这篇关于如何在Android单元测试中用模拟数据填充适配器?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆