首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

我覆盖了espresso ViewAction中的perform方法,但它不起作用,这个方法甚至不会在代码执行时调用

问题描述: 我覆盖了espresso ViewAction中的perform方法,但它不起作用,这个方法甚至不会在代码执行时调用。

回答: 在使用Espresso进行UI测试时,我们可以通过自定义ViewAction来执行特定的操作。覆盖perform方法是实现自定义ViewAction的关键步骤之一。然而,如果perform方法不起作用,或者在代码执行时没有被调用,可能有以下几个原因:

  1. 未正确绑定ViewAction: 确保你在使用ViewAction时,将其正确绑定到目标View上。可以通过使用ViewInteraction.perform()方法来执行自定义的ViewAction。例如:
  2. 未正确绑定ViewAction: 确保你在使用ViewAction时,将其正确绑定到目标View上。可以通过使用ViewInteraction.perform()方法来执行自定义的ViewAction。例如:
  3. perform方法中的逻辑错误: 检查你在perform方法中的逻辑是否正确。确保你在perform方法中实现了你想要的操作,并且没有遗漏任何关键步骤。
  4. ViewAction与目标View不兼容: 确保你的自定义ViewAction与目标View兼容。例如,如果你的ViewAction是针对Button的,但你尝试将其应用于TextView,那么它可能不起作用。确保你的ViewAction与目标View的类型匹配。
  5. Espresso版本不兼容: 检查你使用的Espresso版本是否与你的代码兼容。有时,某些Espresso版本可能与特定的Android版本或库不兼容,导致perform方法不起作用。尝试更新Espresso版本或检查相关的兼容性问题。

如果以上方法都没有解决问题,可以尝试以下步骤来进一步调试和排查问题:

  1. 检查日志: 查看日志输出,看是否有任何与perform方法相关的错误或警告信息。这可能会提供有关问题的更多线索。
  2. 使用断点调试: 在perform方法中设置断点,并使用调试器来跟踪代码执行过程。这样可以确定perform方法是否被调用,以及在执行过程中是否出现任何异常。
  3. 确认View的可见性: 确保目标View在执行perform方法时是可见的。如果View不可见,perform方法可能不会被调用。可以使用Espresso的ViewAssertions来验证View的可见性。

总结: 当覆盖espresso ViewAction中的perform方法时,如果方法不起作用或者不被调用,需要检查绑定、逻辑错误、兼容性、Espresso版本以及其他可能的问题。通过调试和排查,可以找到问题的根本原因并解决它。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Android UI 测试 - Espresso

要是真的去写这测试,还得写许多代码,考虑许多过程,然后再编译,我怎么觉得,还不如 Instant Run 加自己手动操作测试来得快呢。...View 上执行操作 // 执行点击 onView(...).perform(click()); // 执行多个操作 onView(...).perform(typeText("Hello"), click...()); // 如果在 ScrollView 里,要先滚动使 View 在当前页面显示出来,然后再执行其它动作 // 如果 View 本身就在页面中显示,srollTo 不起作用 onView(......).perform(scrollTo(), click()); 可执行的操作参见 https://developer.android.com/reference/android/support/test.../espresso/action/ViewActions 检查状态 主要通过 .check(matches()) 方法,matches 里是寻找 View 的那些过滤方法, // 断言 View 没有显示

1.1K10

Espresso浅析和使用

) .perform(ViewAction) .check(ViewAssertion); 其中,onView是用来定位View控件的,perform是操作控件的,check是校验View控件的状态...1.2 完整测试用例代码 这是一个非常简单的测试用例,通过R.id.button定位控件,对它调用了一下click,最后校验控件是不是enabled状态。...这个视频中提到了2个写测试用例时的注意项: 避免Activity的层级跳转,测试用例尽量只在单个Activity内完成。...Activity层级跳转越多,越容易出错 强烈不推荐,直接获取View的对象,调用View的方法来模拟用户操作。...原因是,Espresso的用例运行过程是只有当UI线程IDLE和UI队列没有需要执行的事件时,Espresso的测试代码才会被执行。使用方无需写Sleep逻辑等待UI绘制完成。

2.4K00
  • Android使用Espresso实现UI自动化测试

    所以当你想直接测试某个界面时,你可以把那个界面填到这个参数里,这样就直接打开你指定的界面进行测试了。...@Test @Test public void testLogin() { ... } 定义一个测试方法,当你的测试类运行时,所执行的代码就是Test注解下的方法(Espresso还提供了其他的一些注解...: 比如@After,@Before等,具体的用法可以去我上面写的android官网上查看),当然上面那段代码对应的就是testLogin测试方法,testLogin方法里所定义的就是要测试的内容。...ViewActions 执行事件 对View的操作:perform()方法 方式是onView(...).perform()。...也可以执行多个操作在一个perform中如:perform(click(),clearText())。 所有的操作都有一个前提 ———— 就是要执行的view必须在当前界面上显示出来(有且可见)。

    1.5K20

    基于Kotlin DSL的Espresso和UIAutomator的融合客户端自动化

    然而,如果我们想设计一套自顶向下,设备、接口、代码层级均可自动化执行且有一定校验的框架或系统时,就会发现这两个完全不同语法的库融合一起后,可读性和可维护性几乎等于零。...Espresso 在Espresso中,我们一般会处理三种类型的对象:匹配器、ViewAction和ViewAssertions。...中属于God对象,即每次调用都会需要用到UIDevice实例 4、定义UISelector,UISelector的作用是可以通过资源ID查询想要的UI组件,但是UIAutomator中没有这种方法,所以我们需要用到步骤...而在Kotlin中,DSL 则是对 Kotlin 所有语法糖的一个大融合,它的代码结构通常是链式调用、lambda 嵌套,并且接近于日常使用的英语句子,我们可以愉悦的使用 DSL 风格的 API,同时,...我们如果要自行更新或增加Kotlin DSL库的内容,可以将UIAutomator和Espresso相同的操作通过Espresso实现,并集合在库中。

    2.3K50

    Android开发者的UI自动化测试上手指南

    这里包含了三个流程: 找元素:找到UI上测试所针对的元素; 做操作:给这个元素做一些操作; 检查结果:这个元素做出了我期望的行为。....check(matches(isDisplayed())); } 代码逻辑也是典型的三步: 首先通过withId方法找到了id为name_field的EditText组件,并且调用typeText方法对其进行设置...一些Espresso的主要方法 UI自动化具体实例 这里建议参照官方文档给出的步骤进行实践,示例给出自己在实践demo中配置自动化测试的基本步骤。...异步和延迟 有时点击一个按钮,ui操作后需要执行一个较为耗时的事情时通常会采用异步回调的方式通知显示结果,这时进行UI自动化测试的第三步验证结果的时机就不能才能同步的方式去执行,而是需要做异步回调通知执行或延迟执行...当方法执行完成,调用ResourceCallback.onTransitionToIdle();则会进行回调通知测试线程继续执行验证代码。 总结 一切能自动化完成的测试操作就不要浪费时间用手动完成。

    85220

    The Clean Architecture in PHP 读书笔记(四)The Clean Architecture in PHP 读书笔记(四)

    ,根据SOLID中D(Dependency Inversion Principle)原则,这显然会导致代码不易重构 It makes it hard to test 由于内部生成使用的类,...此时测试的时候,我们只需要通过setter方法设置MockCustomerRepository即可。 这种方法有一个缺点:如果我们忘记了调用setter方法,那就完蛋了。...使用Constructor injection 此时的代码长这个样子: $controller = new CustomerController( new CustomerRepository() );...one component 当有多个地方都去new同一个类,并且构建需要一些额外动作的时候,我们就要考虑将构建这个动作封装起来了,核心点是:代码复用 The dependency has...,有时间我可以翻译下,通俗的给讲一下的。

    32510

    如何将 urllib2 升级至 pycurl

    在 Python 中,urllib2 是一个用于处理 HTTP 请求的模块,但它在 Python 3 中被拆分成 urllib.request 和 urllib.error。...1、问题背景我有一段代码(如下所示),它使用 urllib2 库。我想将其转换为 pycurl 库,以便受益于 pycurl 的代理支持。pycurl 的转换代码在原始代码之后。...我想知道如何将 urllib.urlopen(req).read() 更改为 pycurl 中类似的方法,也许可以使用 StringIO 之类的方法?...()s.append(z.flush())data = ''.join(s)curl 将在检索到每块数据时调用您的函数一次,因此整个循环都发生在 req.perform() 调用中。...(它也可能会在最后再次调用它,但您得确保您的回调函数能够处理这种情况。我认为 z.decompress 可以,但您可能需要验证一下。)

    4900

    正确使用 waitnotifynotify方法以及源码解析

    另外,当前线程必须持有对象监控器(也就是使用 synchronized 加锁) 必须把 wait 方法写在 synchronized 保护的 while 代码块中,并始终判断执行条件是否满足,如果满足就往下继续执行...到生产者调用 give 方法,放入数据并视图唤醒消费者线程。可这个时候唤醒不起作用呀。消费者并没有在等待。 最后,消费者回去调用 wait 方法,就进入了无限等待中。 看明白了吗?...第一步时,消费者判断了 while 条件,但真正执行 wait 方法时,生产者已放入数据,之前的 buffer.isEmpty 的结果已经过期了,因为这里的 “判断 - 执行” 不是一个原子操作,它在中间被打断了...正确的写法应该是这样子的:以下写法就确保永远 notify 方法不会在 buffer.isEmpty 和 wait 方法之间被调用,也就不会有线程安全问题。...这个锁是对象级别的,而不是线程级别的,每个对象都有锁,通过线程获得。如果线程需要等待某些锁那么调用对象中的 wait 方法就有意义了,它等待的就是这个对象的锁。

    1.3K20

    Swift 中风味各异的类型擦除

    继续从之前的RequestQueue示例开始,我们首先创建该包装器类型——该包装器类型将捕获每个请求的perform方法作为闭包,以及在请求完成后应调用的处理程序: // 这将使我们将 Request...使用闭包擦除类型时,其思想是捕获在闭包内部执行操作所需的所有类型信息,并使该闭包仅接受非泛型(甚至是Void)输入。...,我们必须手动将其转换为RequestOperation——虽然这不会在每个调用点添加大量代码,但这取决于必须完成相同转换的次数,它最终可能会有点像样板。...必须进行类型擦除最初看起来像是一件不必要的杂务,但它也带来了一些好处——比如从不需要关心这些类型的代码中隐藏特定类型信息。...什么样的类型擦除是最合适的——无论是现在还是将来——当然很大程度上取决于上下文,以及我们的功能是否可以在闭包中轻松地执行,或者完整包装器类型或泛型是否更适合这个问题。 感谢阅读!? ?

    1.7K20

    Swift 风味各异的类型擦除

    继续从之前的RequestQueue示例开始,我们首先创建该包装器类型——该包装器类型将捕获每个请求的perform方法作为闭包,以及在请求完成后应调用的处理程序: // 这将使我们将 Request...使用闭包擦除类型时,其思想是捕获在闭包内部执行操作所需的所有类型信息,并使该闭包仅接受非泛型(甚至是Void)输入。...,我们必须手动将其转换为RequestOperation——虽然这不会在每个调用点添加大量代码,但这取决于必须完成相同转换的次数,它最终可能会有点像样板。...必须进行类型擦除最初看起来像是一件不必要的杂务,但它也带来了一些好处——比如从不需要关心这些类型的代码中隐藏特定类型信息。...什么样的类型擦除是最合适的——无论是现在还是将来——当然很大程度上取决于上下文,以及我们的功能是否可以在闭包中轻松地执行,或者完整包装器类型或泛型是否更适合这个问题。

    91620

    ThreadStatus(线程的几种状态)

    阻塞状态是线程阻塞在进入synchronized关键字修饰的方法或代码块(获取锁)时的状态,但是阻塞在java.concurrent包中Lock接口的线程状态却是等待状态,因为java.concurrent...当调用notify()方法后,将从对象的等待队列中移走一个任意的线程并放到锁标志等待池中,只有锁标志等待池中线程才可能够获取锁标志;如果等待队列中没有线程,则notify()不起作用。...在A线程中调用了B线程的join()方法时,表示只有当B线程执行完毕时,A线程才能继续执行。如果有多个线程,除了A线程之外的其他线程正常竞争cpu和锁。...sleep方法使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁。...直到对应的线程执行resume()方法后,被挂起的线程才能继续,从而其它被阻塞在这个锁的线程才可以继续执行。

    98520

    Java线程状态(生命周期)以及线程状态转换详解

    阻塞状态是线程阻塞在进入synchronized关键字修饰的方法或代码块(获取锁)时的状态,但是阻塞在java.concurrent包中Lock接口的线程状态却是等待状态,因为java.concurrent...当调用notify()方法后,将从对象的等待队列中移走一个任意的线程并放到锁标志等待池中,只有锁标志等待池中线程才可能够获取锁标志;如果等待队列中没有线程,则notify()不起作用。...join方法的主要作用就是同步,它可以使得线程之间的并行执行变为串行执行,有些类似于同步的运行效果。在A线程中调用了B线程的join()方法时,表示只有当B线程执行完毕时,A线程才能继续执行。...join方法中如果传入参数,则表示这样的意思:如果A线程中调用B线程的join(10),则表示A线程会等待B线程执行10毫秒,10毫秒过后,A、B线程并行执行。...其他线程都无法访问被它占用的锁。直到对应的线程执行resume()方法后,被挂起的线程才能继续,从而其它被阻塞在这个锁的线程才可以继续执行。

    68340

    小心!做 UI 自动化一定要跨过这些坑

    1 优化测试代码框架 无论你选择appium、uiautomator、robotium还是espresso,刚入门时,看到的sample应该大致都是这样的。...拿上面的espresso来说: 假如action_save这个id开发改了,而你的用例集中,有30个步骤用例到了这个id,一个个去改,是不是要疯?...这两个方法,基本解决了笔者遇到的图一中所有的设计类问题。 图三 框架设计建议 按照图三进行分层设计后,得到如图四的测试代码包。...其实,在框架层驱动测试开始前,框架会先调用如下图八所示的setAllField来初始化所有的page页面。 如果被测应用未混淆资源,该方法只是将@FindBy中的值赋值给Field。...该方法可以在@BeforeClass中或者RunListener的testRunStarted中调用。

    4.5K11

    小心!做UI自动化一定要跨过这些坑

    “测试框架自己有bug,我改用例也没用啊……” “我调试的时候这个用例还是通的,放到daily里面跑就不通,到底怎么回事嘛!”...1、优化测试代码框架 无论你选择appium、uiautomator、robotium还是espresso,刚入门时,看到的sample应该大致都是这样的。 ?...拿上面的espresso来说: 1.假如action_save这个id开发改了,而你的用例集中,有30个步骤用例到了这个id,一个个去改,是不是要疯?...其实,在框架层驱动测试开始前,框架会先调用如下图八所示的setAllField来初始化所有的page页面。 1、如果被测应用未混淆资源,该方法只是将@FindBy中的值赋值给Field。...该方法可以在@BeforeClass中或者RunListener的testRunStarted中调用。

    1.2K91

    使用Calabash进行Android和iOS UI测试

    如果你一直在手动测试你的应用程序,你可能会浪费大量的时间来重复执行相同的任务。你可以对代码进行一些修改,构建应用程序,在设备或模拟器中运行它,并调整应用程序,以确定它是否符合预期。...官方文档甚至还推荐了用于测试的特定框架。官方Android文档涵盖了有关Espresso的一些主题,即Android UI测试框架。同样,Apple建议使用XCTest框架。...每一个意识到测试自动化的开发人员都知道这是一个好主意。但是,当谈到坐下来写这些测试时,许多开发人员开始质疑是否值得他们的时间,因为“手动触碰按钮”会比编写一个自动“触碰这个按钮”的代码要快得多。...Calabash:移动应用程序的自动验收测试 大约一年前,我开始寻找一个测试框架,这个框架对于那些不是软件开发人员的人来说很容易使用。而这是我发现Calabash的时候。...这个开源测试框架由Xamarin团队开发和维护,适用于Android和iOS。它允许您为移动应用程序编写和执行自动化的验收测试。

    2K10

    COLA-statemachine事务失效踩坑

    以期望在后续操作中更好的利用Spring的特性 简单改造后的状态机代码可能如下 // 以下代码并不是定义状态机的正确做法,错误的使用方法造成了事务失效,后面在方法二中解析 @Component public...,无典型事务失效场景,搜索半天@TransactionalEventListener监听不起作用的原因无果后,我又仔细检查了StateMachine类中when和perform的调用,也都是通过@Autowired...代码改造后看起来很正常,按理来说不应该出现这个问题。 在百思不得其解的时候,我发现本地的日志输出稍微和平时有些不一样,在执行上述Action逻辑时,没有mybatis-plus的事务相关日志。...execute 我在状态机的使用过程中并没有直接调用该方法,所以只能是由框架内部调用的。...,用代理对象进行自身方法的调用 很可惜,两种方法在当前场景都不适用,因为自调用在COLA框架内部,如果为了解决这个问题去再包装框架就有点大动干戈了。

    1.3K12

    Android 单元测试和 UI 测试初步实践

    它跟 @Rule 注解几乎相同,可以在所有类方法开始前进行一些相关的初始化调用操作。使用这个注解,可以在执行测试用例的时候加入特有的操作,而不影响原有用例代码,有效减少耦合程度。...所谓的 mock 就是创建一个类的虚假的对象,在测试环境中,用来替换掉真实的对象,以达到验证对象方法调用情况,或是指定这个对象的某些方法返回特定的值等; @Before 注解的方法会在执行测试用例之前执行...,所以在代码前两行笔者通过 Mockito 的 when() 方法,在程序调用 DataManager#getNews() 方法时返回一个空的 NewsResultBean 实例。...执行操作:执行 P 层的 NewsPresenter#getNews()。在业务逻辑中,执行此方法之后,会先调用 DataManager#getNews(),然后将数据交给 V 层的代理。...其实这个方法也是有输出的,输出就是:调用了 DataManager#getNews() 方法,获取到数据后调用 NewsContract.View#showNews(news) 显示数据。

    2.1K10

    Android 中构建快速可靠的 UI 测试

    前言 让我一起来看看 Iván Carballo和他的团队是如何使用Espresso, Mockito 和Dagger 2 编写250个UI测试,并且只花了三分钟就运行成功的。...在下面的例子中你可以看到一个模拟的UserApi 类并且stub(译者注:stub,也即“桩”,主要出现在集成测试的过程中,从上往下的集成时,作为下方程序的替代。...这也是一个难点所在,如果你的代码构建得并不是易于测试(test-friendly)的,替换真实对象的过程会变得异常艰难甚至是说不可能完成。还要注意的是,你想要模拟的代码必须独立到一个单独的类里面。...比如说,如果你直接从你的activity中使用HttpURLConnection调用REST API 进行数据访问(我希望你不要这么做), 这个操作过程模拟起来也就会非常困难。...2调用基类的Statement 的evaluate()方法(这是在test的时候执行) 3 设置Application的component字段为空,也就让其恢复到初始状态。

    93410
    领券