Hacktoberfest 2026: die Issues, die Maintainer für den Oktober markiert haben – offen und einsteigerfreundlich. Hacktoberfest-Issues durchsuchen

AbstractMethodError for abstract Widget class - since migration to byte-buddy

Offen
#2,372 0 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Maintainer antworten meist innerhalb von 5 Tagen

Dieses Issue hat noch niemand übernommen.

Bewertung

Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Anfängerfreundlichkeit
50/100
Issue-Typ
Bug
Klarheit
Größtenteils klar
Aktivitätsstatus
Veraltet
Tech-Stack
android, ios, java

Rechercherichtung

Beginne mit dem abstrakten Widget-Beispiel in Page-objects.md und verfolge, wie OverrideWidget, WidgetInterceptor und field.getType() die Widget-Klasse auswählen. Stelle die Android- und iOS-Fälle aus dem Issue nach und überprüfe anschließend, dass Aufrufe der Plattformimplementierungen bei Verwendung von Byte Buddy keinen AbstractMethodError mehr auslösen.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Beschreibung

bug
Is there an existing issue for this?
  • I have searched the existing issues
Appium Version

2.0.1

Appium Host Type

Command Line

Are you using Appium components not maintained by the Appium team?

No response

Is this issue reproducible using the latest components?
  • I confirm the issue is still reproducible with the latest component versions
Current Behavior

Currently my repo(Android & iOS combined) is using java-client version: 8.3.0
I did not update my version since I got issues with the new byte buddy library. I tried to update to the latest java client version(10.0.0) and still, I get the same issue.
The issue:
I am working according to this docs: PO - abstract Widget class.
When I run my tests using a java client with byte buddy I get AbstractMethodError.

Expected Behavior

To work as it did with cglib.

Appium Log

No response

Environment Details
  • Debug details (appium --show-debug-info):
  • Last component version(s) which did not exhibit the problem: appium 2.0.1, java-client 10.0.0
  • Platform and version of device under test: android
  • Real device or emulator/simulator: emulator
Minimal Reproducible Example

Reproduction:
Consider the following setup in your PO:

public class MyPO {

  @OverrideWidget(androidUIAutomator = CustomWidget.AndroidCustomWidget.class, iOSXCUITAutomation = CustomWidget.IOSCustomWidget.class)
  private CustomWidget myCustomWidget;

}

Your Widget class:

public abstract class CustomWidget extends Widget {

public abstract void abstractTest();

  public static class AndroidCustomWidget extends CustomWidget {
          @Override
          public void abstractTest() {
              //android implementation
          }
  }

  public static class IOSCustomWidget extends CustomWidget {
          @Override
          public void abstractTest() {
              //iOS implementation
          }
  }

}

Then in the test class just call:
myPO.getCustomWidget().abstractTest();
You'll get AbstractMethodError since byte buddy tries to call the original abstract method signature

Further Information

I also managed to find the issue and fix it locally. I will detail my steps here.
First, acording to this Callable implements no-abstract methods by default ByteBuddy's proxies(which are essentially just subclasses) subclass the Widget class and passing calls to the Interceptor(in our case Appium's WidgetInterceptor) for non-abstract methods. The issue is that it subclasses the original CustomWidget and thus it cannot call myWidget.abstractTest() and throwing AbstractMethodError. Instead, it needs to subclass AndroidCustomWidget or IOSCustomWidget according to the platform we are currently using. Since the abstractTest method is non-abstract in AndroidCustomWidget and IOSCustomWidget, byte buddy will override and intercept those methods as well - resulting in the desired behavior.

Fix example:

Image

I was just testing and found out that the java client passes widgetType = (Class<? extends Widget>) field.getType(); which in our case is the abstract class CustomWidget, I added a check for android OverrideWidget and it worked perfectly(since the widgetType is now of type AndroidCustomWidget). In cglib it used to work but I guess byte buddy implements things differently so the the code needs to take into consideration the current platform and the Widget class that overrides it.

Vorherrschende Sprache
Java
Sterne
1.3k
Forks
755
Ø Merge
5 T. 14 Std.
Gemergte PRs (30 T.)
8

Entwicklungsumgebung

  • Kein Dockerfile und keine Docker-Compose-Datei
  • Hat eine Pull-Request-Vorlage
  • Kein Beitragsleitfaden

Erste Schritte

  1. Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
  3. Forken Sie das Repository und arbeiten Sie in einem Branch.
  4. Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.

Mehr aus appium/java-client

Alle Issues in appium/java-client

Ähnliche Issues

Weitere Issues zu Java

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.