I try to write test then it use static class.
I have class Person:
public class Person {
private int id;
public Person(String name) {
id = Id.generate(name);
}
public int getId() {
return id;
}
}
And class Id:
public class Id {
public static int generate(String name) {
if (name.equals("I")) {
return 42;
}
return 100;
}
}
This is my test:
import org.easymock.EasyMock;
import org.junit.runner.RunWith;
import org.powermock.api.easymock.PowerMock;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import org.testng.Assert;
import org.testng.annotations.Test;
@RunWith(PowerMockRunner.class)
@PrepareForTest( { Id.class } )
public class MockStaticTest {
@Test
public void test() throws Exception {
PowerMock.mockStatic(Id.class);
EasyMock.expect(Id.generate(null)).andReturn(55);
PowerMock.replayAll();
Person person = new Person(null);
Assert.assertEquals(person.getId(), 55);
PowerMock.verifyAll();
}
}
When I run test, it throws NPE:
java.lang.NullPointerException
at Id.generate(Id.java:3)
at MockStaticTest.test(MockStaticTest.java:17)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
...
On line 17 it calls code of static method Id.generate. In my opinion, it is wrong behavior.