FragmentActivity can not be tested via ActivityInstrumentationTestCase2

I have a problem executing android unit tests against android applications that utilize the recently released Fragment support API. When the test is run against a FragmentActivity the following error shows up in the log and the class fails to load. When run against an identical class, but one derived from Activity the test works fine. Both classes work correctly as apps! Meaning that when simply invoked they both display their layout and function correctly. The support jar is part of the build path and included in the project.

The problem I have is that the only way to utilize fragments (and support pre3.0 android) is to utilize FragmentActivity, but if that excludes automated testing then what good is this library.

  • Datepicker: How to popup datepicker when click on edittext
  • How do I get the dialer to open with phone number displayed?
  • Delete a folder on SD card
  • Android: Status Bar is White
  • AsyncTask, RejectedExecutionException and Task Limit
  • Which stretchMode to use in GridView on android
  • 4-05 18:00:11.276: WARN/dalvikvm(1095): Class resolved by unexpected DEX: Lcom/example/android/app/FragmentLayoutSupport;(0x406351a0):0x12e5c8 ref [Landroid/support/v4/app/FragmentActivity;] Landroid/support/v4/app/FragmentActivity;(0x406351a0):0x12e440
    04-05 18:00:11.276: WARN/dalvikvm(1095): (Lcom/example/android/app/FragmentLayoutSupport; had used a different Landroid/support/v4/app/FragmentActivity; during pre-verification)
    04-05 18:00:11.286: WARN/dalvikvm(1095): Unable to resolve superclass of Lcom/example/android/app/FragmentLayoutSupport; (49)
    04-05 18:00:11.286: WARN/dalvikvm(1095): Link of class 'Lcom/example/android/app/FragmentLayoutSupport;' failed
    04-05 18:00:11.286: ERROR/dalvikvm(1095): Could not find class 'com.example.android.app.FragmentLayoutSupport', referenced from method com.example.android.app.test.FrameLayoutTest.<init>
    04-05 18:00:11.286: WARN/dalvikvm(1095): VFY: unable to resolve const-class 131 (Lcom/example/android/app/FragmentLayoutSupport;) in Lcom/example/android/app/test/FrameLayoutTest;
    

    Here is the code I constructed to demonstrate the issue. The test case simply tries to instantiate the class under test:

    FrameLayoutTest.java    
    public class FrameLayoutTest extends
                ActivityInstrumentationTestCase2<FragmentLayoutSupport> {
            public FrameLayoutTest() {
                super(FragmentLayoutSupport.class);
            }
    
        public void testActivityTestCaseSetUpProperly() {
            assertNotNull("activity should be launched successfully", getActivity());
        }
    }
    

    The two classes I have created are as follows and fragment_layout is an empty LinearLayout:

    FrameLayout.java
    public class FragmentLayout extends Activity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            setContentView(R.layout.fragment_layout);
        }
    }
    

    And

    FragmentLayoutSupport.java
    public class FragmentLayoutSupport extends FragmentActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            setContentView(R.layout.fragment_layout);
        }
    }
    

  • Disable unicode replacement emoji in Android Chrome?
  • Import all imports in eclipse at once?
  • Android inventory.getSkuDetails() returning null
  • setVisibility(View.VISIBLE) doesn't always work. Ideas?
  • How can I completely hide the groupIndicator of an ExpandableListView?
  • Navigation Drawer menu items selected within different groups
  • 3 Solutions collect form web for “FragmentActivity can not be tested via ActivityInstrumentationTestCase2”

    I spent half the night on this, and finally found a solution. The key line is:

    04-05 18:00:11.276, (Lcom/example/android/app/FragmentLayoutSupport; had used a different Landroid/support/v4/app/FragmentActivity; during pre-verification). 
    

    The problem is that the android-support-v4.jar which you are using in your test project is different from that one in your application project. Remove all of the references to android-support-v4.jar from your test project. Then go to your application project Properties->Java Build Path->Order and Export and check android-support-v4.jar to export it. Now both projects will be using the same library, and dalvik won’t complain.

    The IntelliJ answer by Rupert didn’t get me all the way there. I solved this by exporting the jar like the Eclipse answer suggested.

    File > Project Structure > Modules > [select your main app] > dependencies tab > click export check box next to the support jar

    IntelliJ Project Structure

    For any IntelliJ users who run into this problem the equivalent fix is to set the scope of your dependency to ‘Provided’ as follows:

    File > Project Structure > Modules > [select your test app] > dependencies tab > select ‘Provided’ in scope drop down.

    Android Babe is a Google Android Fan, All about Android Phones, Android Wear, Android Dev and Android Games Apps and so on.