0

您好,我正在为一项看似非常简单的任务而苦苦挣扎。我需要编写一个 expresso 单元测试,但我需要该活动使用模拟类而不是它在正常运行期间使用的类。

我看到的最接近的解决方案在这里:

取消或覆盖在 Espresso 测试下的 Activity 中进行的 API 调用

但这需要应用程序级别的 getter 和 setter,并且只处理常量。

下面是一个想做的简单例子:

活动:

public class MainActivity2 extends AppCompatActivity {

    // how do I mock this without using any branches
    // just have expresso replace with MainActivity2CustomClass with a mock?
    private MainActivity2CustomClass mainActivity2CustomClass;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        mainActivity2CustomClass = new MainActivity2CustomClass();
        mainActivity2CustomClass.foo();
    }
}

我想模拟的课程

// Need expresso to replace this class with a mock
public class MainActivity2CustomClass {
    void foo() {
    }
}

为了澄清,我需要使用具有多个类的大型应用程序来执行此操作。所以使用分支不是我寻求的解决方案。例如,这不适用于我的应用程序

    // I DO ***NOT** WANT THIS solution since it will explode in many branches in my application
    Intent intent = new Intent(targetContext, PatientActivity.class);
    intent.putExtra("istestrunning", 2);

    // etc...
    // Not acceptable solution for my problem, creates too many branches and messy code
    if (getIntent().getIntExtra("istestrunning", 0) == 2) {
        mainActivity2CustomClass = new MainActivity2CustomClass();
        mainActivity2CustomClass.foo();
    } else {
        mainActivity2CustomClass2 = new MyMock();
        mainActivity2CustomClass2.foo();
    }

我想知道是否可以让 expresso 在测试时简单地替换该类。可以做到吗?

任何帮助或线索表示赞赏。

谢谢你。

4

0 回答 0