- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如果用户登录,我正在尝试测试我的 SplashActivity 是否正确启动 HomeActivity。
我查看了 StackOverflow 上的相关问题,这似乎是一个常见问题,但我似乎无法解决任何问题。
我已经看到测试在我的设备上执行,并在视觉上验证了 SplashActivity 确实在启动 HomeActivity。
HomeActivity 需要一个没有数据的简单意图。
这是完整的错误:
IntentMatcher: has component: has component with: class name: is "com.shoeboxed.fetch.presentation.ui.activities.HomeActivity" package name: an instance of java.lang.String short class name: an instance of java.lang.String
public class SplashActivityTest extends EspressoIntegrationTest {
@Mock
UserRepository userRepository;
@Rule
public IntentsTestRule<SplashActivity> activityRule = new IntentsTestRule<>(SplashActivity.class, true, false);
@Test
public void loggedInUser() {
User user = Fakes.user();
when(userRepository.getUser()).thenReturn(user);
doNothing().when(userRepository).refreshTeam();
activityRule.launchActivity(new Intent());
intended(hasComponent(HomeActivity.class.getName()));
verify(userRepository, times(1)).getUser();
verify(userRepository, times(1)).refreshTeam();
}
}
public class SplashActivityTest extends EspressoIntegrationTest {
@Mock
UserRepository userRepository;
@Rule
public IntentsTestRule<SplashActivity> activityRule = new IntentsTestRule<>(SplashActivity.class, true, false);
@Test
public void loggedInUser() {
User user = Fakes.user();
when(userRepository.getUser()).thenReturn(user);
doNothing().when(userRepository).refreshTeam();
activityRule.launchActivity(new Intent());
intended(hasComponent(new ComponentName(getTargetContext(), HomeActivity.class)));
verify(userRepository, times(1)).getUser();
verify(userRepository, times(1)).refreshTeam();
}
}
public class SplashActivityTest extends EspressoIntegrationTest {
@Mock
UserRepository userRepository;
@Rule
public IntentsTestRule<SplashActivity> activityRule = new IntentsTestRule<>(SplashActivity.class, true, false);
@Test
public void loggedInUser() {
User user = Fakes.user();
when(userRepository.getUser()).thenReturn(user);
doNothing().when(userRepository).refreshTeam();
WaitActivityIsResumedIdlingResource resource = new WaitActivityIsResumedIdlingResource(HomeActivity.class.getName());
Espresso.registerIdlingResources(resource);
activityRule.launchActivity(new Intent());
intended(hasComponent(new ComponentName(getTargetContext(), HomeActivity.class)));
verify(userRepository, times(1)).getUser();
verify(userRepository, times(1)).refreshTeam();
Espresso.unregisterIdlingResources(resource);
}
private static class WaitActivityIsResumedIdlingResource implements IdlingResource {
private final ActivityLifecycleMonitor instance;
private final String activityToWaitClassName;
private volatile ResourceCallback resourceCallback;
boolean resumed = false;
public WaitActivityIsResumedIdlingResource(String activityToWaitClassName) {
instance = ActivityLifecycleMonitorRegistry.getInstance();
this.activityToWaitClassName = activityToWaitClassName;
}
@Override
public String getName() {
return this.getClass().getName();
}
@Override
public boolean isIdleNow() {
resumed = isActivityLaunched();
if(resumed && resourceCallback != null) {
resourceCallback.onTransitionToIdle();
}
return resumed;
}
private boolean isActivityLaunched() {
Collection<Activity> activitiesInStage = instance.getActivitiesInStage(Stage.RESUMED);
for (Activity activity : activitiesInStage) {
if(activity.getClass().getName().equals(activityToWaitClassName)){
return true;
}
}
return false;
}
@Override
public void registerIdleTransitionCallback(IdlingResource.ResourceCallback resourceCallback) {
this.resourceCallback = resourceCallback;
}
}
public class EspressoIntegrationTest {
private static IdlingResource idlingThreadPool;
private AppComponent oldComponent = app().appComponent();
@Rule
public DaggerMockRule<AppComponent> daggerRule = new DaggerMockRule<>(AppComponent.class, new AppModule(app()))
.set(component -> {
oldComponent = app().appComponent();
app().setAppComponent(component);
});
@BeforeClass
public static void registerResources() {
idlingThreadPool = getIdlingThreadExecutor();
Espresso.registerIdlingResources(idlingThreadPool);
}
@AfterClass
public static void deregister() {
Espresso.unregisterIdlingResources(idlingThreadPool);
}
@After
public void resetApp() {
app().setAppComponent(oldComponent);
}
private static IdlingResource getIdlingThreadExecutor() {
return (IdlingResource) jobExecutor().getThreadPoolExecutor();
}
private static JobExecutor jobExecutor() {
return ((JobExecutor) app().appComponent().threadExecutor());
}
private static App app() {
return (App) getInstrumentation().getTargetContext().getApplicationContext();
}
}
最佳答案
Asserts that the given matcher matches one and only one intent sent by the application under test. This is an equivalent of verify(mock, times(1)) in Mockito. Verification does not have to occur in the same order as the intents were sent. Intents are recorded from the time that Intents.init is called
IntentsTestRule
Intents.init()
将在创建事件后进行计算。据我了解,你开始
HomeActivity
在
SplashActivity.onCreate
并完成
SplashActivity
.
ActivityTestRule
并调用
Intents.init()
在启动事件之前,像这样:
public class SplashActivityTest extends EspressoIntegrationTest {
@Mock
UserRepository userRepository;
@Rule
public ActivityTestRule<SplashActivity> activityRule = new ActivityTestRule<>(SplashActivity.class, true, false);
@Before
public void setUp() throws Exception{
Intents.init();
}
@Test
public void loggedInUser() {
User user = Fakes.user();
when(userRepository.getUser()).thenReturn(user);
doNothing().when(userRepository).refreshTeam();
activityRule.launchActivity(new Intent());
intended(hasComponent(HomeActivity.class.getName()));
verify(userRepository, times(1)).getUser();
verify(userRepository, times(1)).refreshTeam();
}
@After
public void tearDown() throws Exception{
Intents.release();
}
}
关于android-espresso - Espresso 测试失败 : Wanted to match 1 intents. 实际匹配 0 个意图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42400522/
在android支持测试库中,为recyclerview编写测试用例时,某些演示使用TypeSafeMatcher,而其他演示则使用BoundedMatcher。谁能解释我为什么在使用示例或用例时使用
我们目前正在为我们的应用程序的一个区域编写 Espresso UI 测试,这需要我们在每次测试后清除应用程序数据 我们之前尝试过使用 Android Orchestrator 我们之前曾尝试使用带有
我已经看到了一些关于它的问题。 例如。 Android Espresso testing app flow 但是上面的答案在espresso 2中不起作用。这是我的摘录 @Rule public Ac
我正在尝试建立一个测试农场,但我发现了一个很大的障碍。手机处于休眠状态时无法运行 Espresso 测试。 android.support.test.espresso.NoActivityResume
我正在运行“gradlew connectedCheck”来在已安装的应用程序上运行 Espresso 测试,但是这个“gradlew connectedCheck”重写了我的应用程序,然后运行测试。
使用 AndroidInjector 和 Subcomponents 无法将作用域对象的事件注入(inject) Espresso 的 Test 类。 以前使用应用程序级组件和事件组件,只要您创建一个
我正在使用Espresso为我的Android应用程序编写UI测试,并想使用MockWebServer模拟HTTP请求。 在运行测试之前,我需要模拟身份验证响应并登录用户。 有没有一种方法可以使应用程
我有一个 ExpandableListView,我想 click() 它的一个 subview 。 我尝试了LOADS OF不同的方法,但我似乎无法理解 Espresso 的工作原理。 例如,为什么这
我目前不熟悉自动化测试和使用 Android Studio 使用 Espresso 执行自动化测试,我正在尝试对登录屏幕执行自动化测试,我目前在执行特定按钮的点击时遇到问题。我尝试了多种按钮方法,但对
Windows 10(64 位), 安卓工作室 3.1.2, Gradle 4.4,Java 1.8。 这是我的布局 xml 这里 @drawable/sign_in_login_bg
Firebase 测试实验室接受 App Bundle/APK 和 android 测试 APK,并且动态功能模块 UI 测试在 Firebase 测试实验室中失败。该错误是关于一些多 dex 问题,
根据我在网络上所做的搜索,我发现很少有人认为 Espresso UI 测试框架不支持 WebViews?是这样吗? 最佳答案 Espresso 支持 WebView,我在下面添加了一个示例 http:
使用 Espresso,我希望能够单击 ExpandableListView(名为 CustomExpandableView)的特定子项。 listview 创建一组RelativeLayouts(名
我有我的 xml 布局: 我想写 Espresso 测试检查 EditText 有android:drawableStart="@drawable/ic_sign_in_password". 我该怎
我正在尝试为 Android 应用程序编写 Espresso 测试,并且需要知道如何自动化使用 AutoCompleteTextView 的部分。下面提到了我的应用程序使用的代码: activity_
我正在尝试为 Android 应用程序编写 Espresso 测试,并且需要知道如何自动化使用 AutoCompleteTextView 的部分。下面提到了我的应用程序使用的代码: activity_
在我的应用中,我使用 Kotlin Flow。在我通过 EspressoIdlingResource.increment() 使用挂起函数之前,它不适用于 Kotlin Flow。如何解决这个问题?
在我的应用中,我使用 Kotlin Flow。在我通过 EspressoIdlingResource.increment() 使用挂起函数之前,它不适用于 Kotlin Flow。如何解决这个问题?
我正在尝试使用 onData 运行 espresso 测试,对于其中只有一个 AdapterView 的 View ,一切正常。但是,当屏幕显示其中嵌套了多个适配器 View 的 View 时,我得到
我想测试是否显示 ID 为 imageViewTour 且标签包含 some_text 的 imageView。 我的测试: onView(allOf(withId(R.id.imageViewTou
我是一名优秀的程序员,十分优秀!