AmyWuGo
AmyWuGo

Reputation: 2425

How to test just one line source in Android?

I have to make a Android Junit Test. And the source just like this way:

public class A extends Activity{

    private classB mB;
    private int mType = 2; 

    somebutton.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                       mB.showDialog(
                            new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog, int which) {
                                 //next line is the modified and I have to make test file                               
                                  mB.setType(mType);
                                }
                            }
                       )
                }
        }
  }

And I could let the test click button and prepare all other needed things, but I want to how to assertTrue? And there is no "getType()" and the "Type" in "mB" is private.

Thank you for your time.

Upvotes: 0

Views: 142

Answers (1)

Konstantin Pribluda
Konstantin Pribluda

Reputation: 12367

Unit-Testing is diffucult on android because all the SDK classes are stubbed out and are good only for compiling agains them, and running unit tests on device or emulator is PITA

Alternative is mocking. [Most] Suitable mock framework is JMockit ( it can mock final private static - also everything you can dream of)

Here is small example showcasing using of jmockit against android classes:

/**
 * shall inject assignable views   into
 */
@Test
public void testSimpleInjection(@Mocked final WithInjectableViews injectable,
                                @Mocked final TextView textView,
                                @Mocked final Button button) {

    new Expectations() {
        {
            injectable.findViewById(239);
            returns(textView);


            injectable.findViewById(555);
            returns(button);


        }
    };

    ViewInjector.startActivity(injectable);

    assertEquals(textView, Deencapsulation.getField(injectable, "asView"));
    assertEquals(button, Deencapsulation.getField(injectable, "button"));
    assertNull(Deencapsulation.getField(injectable, "notInjected"));

}


class WithInjectableViews extends Activity {
    // shall be injected
    @InjectView(id = 239)
    private android.view.View asView;
    @InjectView(id = 555)
    private Button button;
    // shall be left alone
    private View notInjected = null;

}

(full source: https://github.com/ko5tik/andject/blob/master/src/test/java/de/pribluda/android/andject/ViewInjectionTest.java)

However, it is diffucult to mock up anonymous inner classes, so you may have to refactor somehow. As to access to provate fields and mewthods - jmockit provides untility class Deencalsulation - it ignores almost all access constraints.

Upvotes: 0

Related Questions