我是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;
}
}