Skip to content
This repository was archived by the owner on Feb 13, 2026. It is now read-only.
This repository was archived by the owner on Feb 13, 2026. It is now read-only.

Mocked UiBinder type is erased #51

@cushon

Description

@cushon

I think is is distinct from #50.

In the following example the type of the UiBinder is erased when it is mocked, causing a ClassCastException.

I think there's type information available at runtime that could be used to fixed this. For example, see mockito's handling of RETURNS_DEEP_STUBS with generic types:

Here's the example:

@RunWith(GwtMockitoTestRunner.class)
public class MyWidgetTest {

  interface Appearance {
    // Mocked type will be erased to `UIBinder`
    UiBinder<? extends Widget, ?> uiBinder();
  }

  static class Widget {
    public Widget() {
      Appearance appearance = GWT.create(Appearance.class);
      // Assignment fails with CCE
      Widget widget = appearance.uiBinder().createAndBindUi(null);
    }
  }

  @Before
  public void setUp() {
    new Widget();
  }

  @Test
  public void simpleTest() {
    System.err.println("Hello world");
  }
}

Full repro:

mkdir -p src/test/java/mockitobug/
curl https://gist.githubusercontent.com/cushon/8c231f89708dadcf0075/raw/d9e50510499132037cac47dbd8ad67854fe8b429/MyWidgetTest.java > src/test/java/mockitobug/MyWidgetTest.java
curl https://gist.githubusercontent.com/cushon/50a9cbe451e7d6607a65/raw/94d77af02627d2b7b1756ff14e7a396514d7aeaa/pom.xml > pom.xml
mvn test
Running mockitobug.MyWidgetTest
Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.514 sec <<< FAILURE!
simpleTest(mockitobug.MyWidgetTest)  Time elapsed: 0.216 sec  <<< ERROR!
java.lang.ClassCastException: org.mockito.internal.creation.jmock.ClassImposterizer$ClassWithSuperclassToWorkAroundCglibBug$$EnhancerByMockitoWithCGLIB$$99e9e895 cannot be cast to mockitobug.MyWidgetTest$Widget
    at mockitobug.MyWidgetTest$Widget.<init>(MyWidgetTest.java:22)
    at mockitobug.MyWidgetTest.setUp(MyWidgetTest.java:28)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        ...

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions