我尝试编写测试然后使用静态类。
我有班级人员:
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的代码。在我看来,这是错误的行为。
答案 0 :(得分:2)
当构造函数调用new Person(null)
和generate(name)
调用generate
时,调用name.equals
将抛出此异常。 那是你的问题:name
是null
。
在您的情况下,一种方法是使用 Yoda条件 "I".equals(name)
。虽然这看起来很奇怪,但它确实允许您依靠java.lang.String
null
进行.equals
检查,这意味着您无需亲自执行此操作。
答案 1 :(得分:0)
您正在传递null
作为参数,那为什么不给NullPointerException
?
在第17行,你应该给出正确的论据。
答案 2 :(得分:0)
我找到了解决方案。 测试类必须扩展PowerMockTestCase。
正确:
public class MockStaticTest extends PowerMockTestCase {
...
}