Saturday, 9 October 2021

How do I mock a class with expresso in android?

Hello I am struggling with a task that seems very simple. I need to write an expresso unit test but I need the activity to use a mocked class instead of the one it uses during the normal run.

the, the closest solution I saw was here:

Nullifying or overriding API calls made in an Activity under an Espresso test

But this requires getters and setters at the application level and only deals with constants.

Here is a simple example of want to do:

Activity:

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();
    }
}

the class I want to mock

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

To clarify I need to do this with a large application with several classes. So using branches is NOT the solution I seek. For instance this will not work for my application

    // 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();
    }

I want to know if it possible to have expresso simply replace that class at testing time. Can it be done?

Any help or leads is appreciated.

thank you.



from How do I mock a class with expresso in android?

No comments:

Post a Comment