单元测试安卓标签布局



我是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价值。

提前谢谢。

我知道

,这可能不是您要找的答案,但您不应该为 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 下。

了解更多关于浓缩咖啡的信息

这是我

为对具有可滑动片段ViewPager进行单元测试而编写的代码。我为我的程序制作了一些自定义类,但这不会有问题。你会得到一个非常可靠的想法来继续你的代码:

附言。这是一个仪器测试。这些测试主要用于测试 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);
    }
}
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;
    }
}

最新更新