单元测试Android Tab布局

时间:2019-07-16 12:55:41

标签: android robolectric

我是Android单元测试的新手,正在尝试使用Robolectric为Android标签布局编写一些测试用例。我能够验证标签数和标签标题。但是我无法验证标签中的某些内容。谁能帮助我获取片段内容并验证其中的某些元素?

这是我的代码

public void verifyTabsDefaultText() throws Exception{
    ViewPager viewPager = searchActivity.findViewById(R.id.container);
    FragmentPagerAdapter tabAdapter = (FragmentPagerAdapter) viewPager.getAdapter();

    viewPager.setCurrentItem(0);

    TextView hintTextView = tabAdapter.getItem(0).getActivity().findViewById(R.id.search_hint_text_view);

    assertTrue(hintTextView.getVisibility() == View.VISIBLE);

}

tabAdapter.getItem(0)赋予null值。

先谢谢了。

3 个答案:

答案 0 :(得分:1)

我知道,这可能不是您要找的答案,但是您不应该为android相关类/视图编写普通的单元测试。您应该做的是编写在实际android设备(或仿真器)上运行的仪器化单元测试(或您可以称其为ui测试),您可以在其中访问android相关类,当前活动(上下文)视图元素而无需做任何技巧。借助Espresso框架,可以非常轻松地执行这样的测试。

使用浓缩咖啡,您可以写

 onView(withId(thatWillOpenPageIWant)).perform(click())
onView(withId(R.id.search_hint_text_view)).check(matches(isDisplayed())) 

或者您可以在匹配项中插入任何其他条件。

重要的是,android有两个不同的目录,即test and androidTest

您的常规单元测试应该在文件夹测试下(您无法访问此目录下的android相关类),而已检测单元测试应该位于androidTest下。

要详细了解espresso

答案 1 :(得分:0)

希望下面的代码有帮助!

import android.app.Activity;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.View;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import static junit.framework.Assert.*;

@RunWith(WithTestDefaultsRunner.class)
public class ViewPagerTest {

private ViewPager pager;
private TestPagerAdapter adapter;

@Before
public void setUp() throws Exception {
    pager = new ViewPager(new Activity());
    adapter = new TestPagerAdapter();
}

@Test
public void shouldSetAndGetAdapter() throws Exception {
    assertNull(pager.getAdapter());

    pager.setAdapter(adapter);
    assertSame(adapter, pager.getAdapter());
}

@Test
public void test_getAndSetCurrentItem() throws Exception {
    pager.setCurrentItem(2);
    assertEquals(2, pager.getCurrentItem());
}

@Test
public void setCurrentItem_shouldInvokeListener() throws Exception {
    TestOnPageChangeListener listener = new TestOnPageChangeListener();
    pager.setOnPageChangeListener(listener);
    assertFalse(listener.onPageSelectedCalled);
    pager.setCurrentItem(2);
    assertTrue(listener.onPageSelectedCalled);
}

private static class TestPagerAdapter extends PagerAdapter {
    @Override
    public int getCount() {
        return 0;
    }

    @Override
    public boolean isViewFromObject(View view, Object object) {
        return false;
    }
}

private static class TestOnPageChangeListener extends ViewPager.SimpleOnPageChangeListener {
    public boolean onPageSelectedCalled;

    @Override
    public void onPageSelected(int position) {
        onPageSelectedCalled = true;
    }
}

答案 2 :(得分:0)

这是我编写的用于对具有可交换片段ViewPager进行单元测试的代码。我为程序制作了一些自定义类,但这不会有问题。您将有一个不错的主意,以继续执行代码:

PS。这是Instrumentation test。这些测试本质上用于测试Android特定功能(例如UI)和类ViewPager(在此处使用)。

package com.example.onboardingfold;

import androidx.test.core.app.ActivityScenario;
import androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner;
import androidx.viewpager.widget.ViewPager;

import com.example.onboardingfold.fragment.OnboardingPage1Fragment;
import com.example.onboardingfold.fragment.adapter.MyCustomFragmentPagerAdapter;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;

import static androidx.test.InstrumentationRegistry.getContext;
import static androidx.test.espresso.Espresso.onView;
import static androidx.test.espresso.assertion.ViewAssertions.matches;
import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed;
import static androidx.test.espresso.matcher.ViewMatchers.withId;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;

@RunWith(AndroidJUnit4ClassRunner.class)
public class MainActivityTest {

    ActivityScenario activityScenario;
    private ViewPager testPager;
    private OnboardingPage1Fragment fragment = new OnboardingPage1Fragment();

    // Intiate the viewPager and PagerAdapter
    @Before
    public void init_ViewPager() {
        testPager = new ViewPager(getContext());
        fragment = (OnboardingPage1Fragment) OnboardingPage1Fragment.newInstance(1);
    }

    // Create a Mock Object of the Custom FragmentPagerAdapter
    @Mock
    MyCustomFragmentPagerAdapter testAdapter = new MyCustomFragmentPagerAdapter(fragment.getFragmentManager());

    // Check for proper instantiation of the viewPager PagerAdapter
    @Test
    public void test_InitAdapter() {
        assertNull(testPager.getAdapter());

        testPager.setAdapter(testAdapter);
        assertSame(testAdapter, testPager.getAdapter());
    }

    // Testing for Adapter NOT_NULL
    @Test
    public void test_AdapterNotNull() {
        assertNotNull(testAdapter);
    }

    // Testing for TabLayout and ViewPager being displayed
    @Test
    public void test_PagerDisplayed() {
        activityScenario = ActivityScenario.launch(MainActivity.class);
        onView(withId(R.id.onboardingViewPager)).check(matches(isDisplayed()));
        onView(withId(R.id.tab_layout)).check(matches(isDisplayed()));
    }
}

这是我的CustomFragmentPagerAdapter

package com.example.onboardingfold.fragment.adapter;

import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentPagerAdapter;

import com.example.onboardingfold.fragment.OnboardingPage1Fragment;
import com.example.onboardingfold.fragment.OnboardingPage2Fragment;

public class MyCustomFragmentPagerAdapter extends FragmentPagerAdapter {

    // for storing the total number of pages in the viewPager
    private static int NUM_PAGES = 2;

    public MyCustomFragmentPagerAdapter(@NonNull FragmentManager fm) {
        super(fm);
    }

    // Returns the fragment to display for that particular page
    @NonNull
    @Override
    public Fragment getItem(int position) {
        switch (position) {
            case 0: // Fragment # 0 - This will show OnboardingPage1Fragment
                return OnboardingPage1Fragment.newInstance(1);
            case 1: // Fragment # 1 - This will show SecondFragment
                return OnboardingPage2Fragment.newInstance(2);
            default:
                return null;
        }
    }

    // returns total number of pages
    @Override
    public int getCount() {
        return NUM_PAGES;
    }

    // returns the width of the page
    @Override
    public float getPageWidth(int position) {
        return super.getPageWidth(position);
    }
}