【问题标题】:Unit test an Android activity对 Android 活动进行单元测试
【发布时间】:2026-01-13 18:10:01
【问题描述】:

我正在 android studio 中制作应用程序。对于这个项目,我必须进行多个单元测试。但我不知道我可以对这个应用程序进行什么单元测试。我真的在单元测试方面苦苦挣扎,所以如果有人可以帮助我,或者想出一些我可以在我的项目中实现的单元测试,我将不胜感激。它是一个带有列表视图的应用程序,可以从 Web 服务中检索数据。

代码:

 public class MainActivity extends AppCompatActivity {

ListView listView;
ArrayAdapter<String> adapter;
String[] data;
String[] waarde;
String[] hoog;
String[] laag;


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

    listView = findViewById(R.id.listview);

    StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().permitNetwork().build());

    getData();

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        Intent intent = new Intent(MainActivity.this, Showdata.class);
        intent.putExtra("teeltbed", listView.getItemAtPosition(position).toString());
        startActivity(intent);
        }
    });

}

private void getData()
{
    String getData = null;
    String dbResult = "empty";
    dbConnect database = new dbConnect(this);

    try{
        String query = "SELECT * FROM Lamp";
        getData = "?query=" + URLEncoder.encode(query, "UTF-8");
        //data += "&username=" + URLEncoder.encode(userName, "UTF-8");
        String link = "http://10.247.240.53/kas/lampen.php";
        dbResult = database.execute(link).get();
    }
    catch (Exception e){

    }

    try{
        JSONObject jsonObject = new JSONObject(dbResult);
        JSONArray array = jsonObject.getJSONArray("Lamp");
        waarde = new String[array.length()];
        data = new String[array.length()];
        hoog = new String[array.length()];
        laag = new String[array.length()];
        for (int i = 0; i < array.length(); i++)
        {
            jsonObject = array.getJSONObject(i);
            data[i] = jsonObject.getString("teeltbed");
            waarde[i] = "A: " + jsonObject.getString("waarde") + " %";
            hoog[i] = "H: " + jsonObject.getString("hoog") + " W/m2";
            laag[i] = "L: " + jsonObject.getString("laag") + " W/m2";

        }

        listView.setAdapter(new dataListAdapter(data, waarde, hoog, laag));
    }

    catch (Exception e)
    {
        e.printStackTrace();
    }
}

class dataListAdapter extends BaseAdapter{
    String[] data, waarde;

    dataListAdapter(){
        data = null;
        waarde = null;
    }

    public dataListAdapter(String[] sdata, String[]swaarde, String[]shoog, String[]slaag)
    {
        data = sdata;
        waarde = swaarde;
        hoog = shoog;
        laag = slaag;

    }

    public int getCount()
    {
        return data.length;
    }

    public Object getItem(int arg0) {
        // TODO Auto-generated method stub
        return null;
    }

    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    public View getView (int position, View convertView, ViewGroup parent)
    {
        LayoutInflater inflater = getLayoutInflater();
        View row;
        row = inflater.inflate(R.layout.layout_list, parent, false);
        TextView t1, t2, t3, t4;
        t1 = (TextView) row.findViewById(R.id.list_item);
        t2 = (TextView) row.findViewById(R.id.list_item2);
        t3 = (TextView) row.findViewById(R.id.list_item3);
        t4 = (TextView) row.findViewById(R.id.list_item4);
        t1.setText(data[position]);
        t2.setText(waarde[position]);
        t3.setText(hoog[position]);
        t4.setText(laag[position]);
        return (row);
    }
}

class Sproeier
{
 public int TeeltBed;
 public String Stand;
 public double Actueel;
 public double Hoog;
 public double Laag;

 public void Sproeier()
 {
     int teeltbed;
     double hoog;
     double laag;
 }
}

class Lamp {

}

public static class ScadaWebservice
{

}

class Kas
{

    public void kas()
    {

    }
}

}

【问题讨论】:

  • 经常对已编写的代码进行改进单元测试会导致“我无法对此进行单元测试”。首先用单元测试编写的代码是可测试的,因为它们会暴露钩子来创建测试。对于 Android UI 测试,您可以查看 developer.android.com/training/testing/fundamentals
  • 单元测试只能在纯 java 类上实现(它不应包含任何与 android 相关的东西),因为您需要采用任何设计模式,因为 adnroid 架构组件也建议......我们有 mvvm 和mvp 你可以在 github 上查看 android blue prints 并查看 mvp 和 mvvm 的示例,它们也有单元和 espresso 测试用例

标签: java android unit-testing testing


【解决方案1】:

因此,您的应用确实没有太多测试方法,但据我所知,您可以测试:

  • 项目点击监听器的列表视图
  • 如果您将 getData 分成更小的部分,您可以测试是否收到响应或错误,以及是否在收到响应的情况下获得数据

对于 UI 测试,您可能需要查看本课程第 8 章: https://eu.udacity.com/course/advanced-android-app-development--ud855

或此代码实验室了解更多想法: https://codelabs.developers.google.com/codelabs/android-testing/index.html?index=..%2F..%2Findex#0

【讨论】: