模拟静态抛出NullPointerException

时间:2015-12-14 13:19:42

标签: java static mocking

我尝试编写测试然后使用静态类。

我有班级人员:

public class Person {
  private int id;
  public Person(String name) {
    id = Id.generate(name);
  }
  public int getId() {
    return id;
  }
}

和班级ID:

public class Id {
  public static int generate(String name) {
    if (name.equals("I")) {
      return 42;
    }
    return 100;
  }
}

这是我的测试:

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();
  }
}

当我运行测试时,它会抛出NPE:

java.lang.NullPointerException
    at Id.generate(Id.java:3)
    at MockStaticTest.test(MockStaticTest.java:17)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
...

在第17行,它调用静态方法Id.generate的代码。在我看来,这是错误的行为。

3 个答案:

答案 0 :(得分:2)

当构造函数调用new Person(null)generate(name)调用generate时,调用name.equals将抛出此异常。 是你的问题:namenull

在您的情况下,一种方法是使用 Yoda条件 "I".equals(name)。虽然这看起来很奇怪,但它确实允许您依靠java.lang.String null进行.equals检查,这意味着您无需亲自执行此操作。

答案 1 :(得分:0)

您正在传递null作为参数,那为什么不给NullPointerException? 在第17行,你应该给出正确的论据。

答案 2 :(得分:0)

我找到了解决方案。 测试类必须扩展PowerMockTestCase。

正确:

public class MockStaticTest extends PowerMockTestCase {
...
}