mercredi 13 décembre 2017

PowerMockito.whenNew not mocked if the subclass doesn't have any constructor

I have a inner private class called MyXStream which extends com.thoughtworks.xstream.XStream.

OuterClass.java

public class OuterClass {
  private class MyXStream extends XStream {
    @Override
    protected MapperWrapper wrapMapper(MapperWrapper next) {
      // implementation details
    }
  }

  public void myMethod() {
    XStream myXStream = new MyXStream();
  }
}

The test case I use

OuterClassTest.java

Class myXStreamClass = Whitebox.getInnerClassType(OuterClass.class, "MyXStream");
XStream xStream = (XStream) PowerMockito.mock(myXStreamClass);
PowerMockito.whenNew(myXStreamClass).withNoArguments().thenReturn(xStream);

And it doesn't work. myXStream is null and cause the NullPointerException. Then I tried to add a constructor to MyXStream to see what happened like this:

public class OuterClass {
  private class MyXStream extends XStream {
    public MyXStream() {
      // some debug statements
    }

    @Override
    protected MapperWrapper wrapMapper(MapperWrapper next) {
      // implementation details
    }
  }
}

And the test case worked.

I can also just replace withNoArguments() with withAnyArguments(), this also worked. Like this:

OuterClassTest.java

Class myXStreamClass = Whitebox.getInnerClassType(OuterClass.class, "MyXStream");
XStream xStream = (XStream) PowerMockito.mock(myXStreamClass);
PowerMockito.whenNew(myXStreamClass).withAnyArguments().thenReturn(xStream);

I just wondering why can't I just use withNoArguments() if I didn't specify any constructor? Shouldn't the Java compiler create an empty one for me? What's the difference between them?

Aucun commentaire:

Enregistrer un commentaire