如何在 android 的 JUnit 测试用例中获取 MainActivity 的上下文和活动?

Posted

技术标签:

【中文标题】如何在 android 的 JUnit 测试用例中获取 MainActivity 的上下文和活动?【英文标题】:How do I get the context and activity of MainActivity in JUnit test cases in android? 【发布时间】:2019-03-05 14:59:08 【问题描述】:

我正在创建一个简单的测验应用程序,用户在其中回答五个问题并将结果烤到屏幕上。在我的 MainActivity 中,我使用参数 context 和 activity 调用 questionsMethods 类的构造函数。

我的问题是:如何在 JUnit 测试类中获取 MainActivity 的上下文和活动?我需要这个,因为 questionsMethods 中的方法利用了上下文和活动。

部分代码: 主要活动:

    public class MainActivity extends AppCompatActivity 
        questionsMethods myQuestionMethods = new questionsMethods(this, this);
        private String[] questionArray = new String[30]; // Holds text file
        @Override
        protected void onCreate(Bundle savedInstanceState) 
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            AssetManager assetManager = getAssets();

            myQuestionMethods.readWriteFile("listofquestions.txt", questionArray); // Reads from text file into array

问题方法:

public class questionsMethods 
private Context mContext;
    private Activity mActivity;
    private int localCounterForCurrQuestionCount = 1;
    private String[] localQuestionsArray = new String[30];     

    public questionsMethods(Context context, Activity activity) 
        mContext = context;
        mActivity = activity;
    

public void readWriteFile(String fileName, String[] questionArray) 
    int count = 0; // Holds count of array index in which a line is stored
    try 
        String nextLine;
        InputStream is = mContext.getAssets().open(fileName); // Retrieves and opens fileName
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(is));
        while ((nextLine = bufferedReader.readLine()) != null)  // Check if line incrementer reaches the end
            questionArray[count] = nextLine;
            count++;
        
     catch (java.io.IOException ex) 
        Log.i("Error", "Cannot read file");
        System.exit(1);
    
    localQuestionsArray = questionArray;

【问题讨论】:

【参考方案1】:

使用 Robolectric,但是您的代码很难测试。 QuestionMethods 类只负责业务逻辑,不应该依赖于android

所以如果你想让你的代码更干净并且你想正确地测试QuestionMethods, Robolectric 不应用于负责业务逻辑的类。

【讨论】:

以上是关于如何在 android 的 JUnit 测试用例中获取 MainActivity 的上下文和活动?的主要内容,如果未能解决你的问题,请参考以下文章

从 JUnit 测试用例中找不到资源文件

在Spring Boot Junit测试用例中使用contextLoads方法有什么用?

事务回滚在 JUnit5 的 @Nested 类的测试用例中不起作用

如何使 JUnit 测试用例按顺序运行?

在每个带有 http 调用的 junit 测试用例之后进行数据库清理

如何从命令行运行 JUnit 测试用例