google-code-export / gwt-test-utils

Automatically exported from code.google.com/p/gwt-test-utils
1 stars 0 forks source link

NullPointer Exception on unittest that uses Composite with mocked widget #76

Closed GoogleCodeExporter closed 9 years ago

GoogleCodeExporter commented 9 years ago
What steps will reproduce the problem?
1. Run the following unit test

package obfuscated;

import com.google.gwt.user.client.Element;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.CustomButton;
import com.google.gwt.user.client.ui.PushButton;
import com.octo.gwt.test.GwtTestWithMockito;

import junit.framework.Assert;

import org.junit.Test;
import org.mockito.Mock;
import org.mockito.Mockito;

public class CompositeGwtUtilsTest extends GwtTestWithMockito {

    @Mock
    private PushButton injectedButton;

    @Mock
    private Element element;

    public class MyComposite extends Composite {

        public MyComposite(CustomButton button) {
            initWidget(button);
        }
    }

    @Test
    public void testComposite() {
        Mockito.when(injectedButton.getElement()).thenReturn(element);
        MyComposite composite = new MyComposite(injectedButton);
        Assert.assertTrue(true);
    }

    @Override
    public String getModuleName() {
        return "<obf_module>";
    }
}

What is the expected output? What do you see instead?

I expect the test to pass, but get this stacktrace:
java.lang.NullPointerException
    at com.octo.gwt.test.internal.patchers.dom.JavaScriptObjects.setProperty(JavaScriptObjects.java:285)
    at com.octo.gwt.test.internal.patchers.UIObjectPatcher.setElement(UIObjectPatcher.java:72)
    at com.google.gwt.user.client.ui.UIObject.setElement(UIObject.java)
    at com.google.gwt.user.client.ui.Composite.initWidget(Composite.java:87)
    at obfuscated.CompositeGwtUtilsTest$MyComposite.<init>(CompositeGwtUtilsTest.java:26)
    at obfuscated.CompositeGwtUtilsTest.testComposite(CompositeGwtUtilsTest.java:34)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
    at org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner.java:79)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
    at com.octo.gwt.test.internal.runner.AbstractGwtRunner.run(AbstractGwtRunner.java:40)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:46)
    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)

What version of the product are you using? On what operating system?
gwt-test-utils 0.33, GWT 2.3, Mockito 1.8.5

Original issue reported on code.google.com by Vieg...@gmail.com on 29 Sep 2011 at 8:25

GoogleCodeExporter commented 9 years ago

Original comment by gael.laz...@gmail.com on 29 Sep 2011 at 8:29

GoogleCodeExporter commented 9 years ago
Fixed on 0.35-SNAPSHOT, 0.33.1-SNAPSHOT, 0.28.8-SNAPSHOT, 0.25.5-SNAPSHOT and 
0.22.5-SNAPSHOT.

It was a strange one, it turns out the JavaScriptObject default constructor 
(which I patch to add some behaviour) is not called when mocking one of its 
subclass (Element in  this case).
I'll have to go deeper in Mockito sources to be able to explain this..

Could you please give it a try an report some feedback so I could close this 
issue ?

Original comment by gael.laz...@gmail.com on 5 Oct 2011 at 6:12

GoogleCodeExporter commented 9 years ago
You can close the issue; it works :)

THX a lot

Original comment by Vieg...@gmail.com on 5 Oct 2011 at 8:41

GoogleCodeExporter commented 9 years ago

Original comment by gael.laz...@gmail.com on 5 Oct 2011 at 8:43