gwt-test-utils / gwt-test-utils

gwt-test-utils is a Java framework that allows to test GWT client side code in a efficient, easy way
124 stars 49 forks source link

Method called from patcher is not visible #29

Open ajozwik opened 11 years ago

ajozwik commented 11 years ago

Affected version: gwt-test-utils-0.44 gwt-test-utils-gxt2-0.44 (and 43) GWT version 2.5.1

Test to reproduce:

import com.extjs.gxt.ui.client.widget.Window; import com.extjs.gxt.ui.client.widget.button.ToolButton;

public class TestRemoveClassName{ @Test public void test() { ToolButton toolButton = new ToolButton("aa"); Window window = new Window(); window.add(toolButton); window.show(); // line 36 }

}

java.lang.AssertionError: No classes for removeClassName(Ljava/lang/String;)V at com.googlecode.gwt.test.internal.rewrite.OverlayTypesRewriter$MyInstanceMethodOracle.findOriginalDeclaringClass(OverlayTypesRewriter.java:110) at com.googlecode.gwt.test.internal.rewrite.RewriteRefsToJsoClasses$MyMethodAdapter.visitMethodInsn(RewriteRefsToJsoClasses.java:78) at com.google.gwt.dev.asm.ClassReader.accept(ClassReader.java:1371) at com.google.gwt.dev.asm.ClassReader.accept(ClassReader.java:420) at com.googlecode.gwt.test.internal.rewrite.OverlayTypesRewriter.rewrite(OverlayTypesRewriter.java:578) at com.googlecode.gwt.test.internal.GwtClassLoader$GwtClassLoaderWithRewriter.findClassBytes(GwtClassLoader.java:100) at com.googlecode.gwt.test.internal.GwtClassLoader.findClass(GwtClassLoader.java:180) at javassist.Loader.loadClass(Loader.java:312) at java.lang.ClassLoader.loadClass(ClassLoader.java:356) at com.extjs.gxt.ui.client.core.El.removeStyleName(El.java) at com.extjs.gxt.ui.client.widget.Component.removeStyleName(Component.java:942) at com.extjs.gxt.ui.client.widget.button.ToolButton.onRender(ToolButton.java:67) at com.extjs.gxt.ui.client.widget.Component.render(Component.java:1023) at com.extjs.gxt.ui.client.widget.Component.render(Component.java:986) at com.extjs.gxt.ui.client.widget.layout.TableRowLayout.renderComponent(TableRowLayout.java:133) at com.extjs.gxt.ui.client.widget.Layout.renderAll(Layout.java:352) at com.extjs.gxt.ui.client.widget.layout.TableRowLayout.onLayout(TableRowLayout.java:125) at com.extjs.gxt.ui.client.widget.Layout.layout(Layout.java:114) at com.extjs.gxt.ui.client.widget.Container.doLayout(Container.java:351) at com.extjs.gxt.ui.client.widget.Container.layout(Container.java:443) at com.extjs.gxt.ui.client.widget.LayoutContainer.layout(LayoutContainer.java:246) at com.extjs.gxt.ui.client.widget.Container.layout(Container.java:426) at com.extjs.gxt.ui.client.widget.LayoutContainer.layout(LayoutContainer.java:241) at com.extjs.gxt.ui.client.widget.HorizontalPanel.onRender(HorizontalPanel.java:163) at com.extjs.gxt.ui.client.widget.Component.render(Component.java:1023) at com.extjs.gxt.ui.client.widget.Component.render(Component.java:986) at com.extjs.gxt.ui.client.widget.Header.onRender(Header.java:250) at com.extjs.gxt.ui.client.widget.Component.render(Component.java:1023) at com.extjs.gxt.ui.client.widget.Component.render(Component.java:986) at com.extjs.gxt.ui.client.widget.ContentPanel.onRender(ContentPanel.java:1041) at com.extjs.gxt.ui.client.widget.Window.onRender(Window.java:1243) at com.extjs.gxt.ui.client.widget.Component.render(Component.java:1023) at com.extjs.gxt.ui.client.widget.Component.onAttach(Component.java:1637) at com.extjs.gxt.ui.client.widget.Container.onAttach(Container.java:470) at com.google.gwt.user.client.ui.Widget.setParent(Widget.java:475) at com.google.gwt.user.client.ui.Panel.adopt(Panel.java:127) at com.google.gwt.user.client.ui.ComplexPanel.add(ComplexPanel.java:97) at com.google.gwt.user.client.ui.AbsolutePanel.add(AbsolutePanel.java:97) at com.extjs.gxt.ui.client.widget.Window.show(Window.java:917) at TestRemoveClassName.test(TemplateTest.java:36) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:601) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27) at org.junit.runners.ParentRunner.run(ParentRunner.java:309) at com.googlecode.gwt.test.internal.junit.GwtBlockJUnit4ClassRunner.run(GwtBlockJUnit4ClassRunner.java:27) at com.googlecode.gwt.test.internal.junit.AbstractGwtRunner.run(AbstractGwtRunner.java:47) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

Class loader cannot find/method: "com/google/gwt/dom/client/Element" "removeClassName(Ljava/lang/String;)V"

But this method should not be redefined It is called from patcher com.googlecode.gwt.test.gxt2.internal.patchers.ElPatcher; @PatchMethod static El removeStyleName(El el, String styleName) { if (styleName != null) { Element elem = getWrappedElement(el); elem.removeClassName(styleName); } return el; }

ajozwik commented 11 years ago

I copied ElPatcher to my project (original package) and run test again. It passed.

j3rem1e commented 11 years ago

Signature of "removeClassName()" have changed since GWT 2.5.0 : removeClassName return a boolean now.

The signature build from bytecode in ElPatcher is "removeClassName(Ljava/lang/String;)V" (return void) but the signature found from introspecting the class com.google.gwt.dom.client.Element is "removeClassName(Ljava/lang/String;)Z" (return boolean) => the signature is not found in OverlayTypesRewriter => NPE

I suppose this issue will be fixed when gwt-test-utils 0.45 will be released (ie when compiled against gwt 2.5.1).

This issue is a blocker for gwt-test-utils with gxt.

adamturski commented 10 years ago

I have the same problem, when my test use GWT-Bootstrap Icon. This is the begginning of stacktrace: java.lang.AssertionError: No classes for removeClassName(Ljava/lang/String;)V at com.googlecode.gwt.test.internal.rewrite.OverlayTypesRewriter$MyInstanceMethodOracle.findOriginalDeclaringClass(OverlayTypesRewriter.java:110)

and from debugger: class: com.googlecode.gwt.test.internal.rewrite.OverlayTypesRewriter$MyInstanceMethodOracle@7db88843 desc: com/google/gwt/user/client/Element signature: removeClassName(Ljava/lang/String;)V

Is there some kind workaround of this problem?

adamturski commented 10 years ago

I try write patcher for class Element but this doesn't work ;-(

This is my patcher:

import com.google.gwt.user.client.Element; import com.googlecode.gwt.test.patchers.PatchClass; import com.googlecode.gwt.test.patchers.PatchMethod;

@PatchClass( Element.class ) class ElementPatcher { @PatchMethod(override = true) static boolean removeClassName( String className ) { return true; } }

adamturski commented 10 years ago

I wrote patcher for GWT-Bootstrap Icon with 3 methods that use getElement() method and it works. Is there another workaround issue with boolean removeClassName(String className)? Because I think that not only Icon class use luckless getElement() method?