2015-12-14 51 views
2

我嘗試編寫測試,然後使用靜態類。模擬靜態拋出NullPointerException

我有類人:

public class Person { 
    private int id; 
    public Person(String name) { 
    id = Id.generate(name); 
    } 
    public int getId() { 
    return 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

我找到了解決方案。 測試類必須擴展PowerMockTestCase。

正確:

public class MockStaticTest extends PowerMockTestCase { 
... 
} 
2

調用new Person(null)將拋出此異常,因爲構造函數調用generate(name)generate調用name.equals是你的問題:namenull

你的情況的一個方面是使用尤達條件"I".equals(name)。雖然第一眼看起來很奇怪,但它確實允許您依靠java.lang.String.equals中作出null檢查,這意味着您不必親自操作。

+0

我不熟悉EasyMock的,它的怪異的是'expect'運行代碼.. – Maroun

+0

我知道NPE拋出'name.equals( 「I」)',它是意向。這證明'EasyMock.expect(Id.generate(null))。和返回(55);'調用'Id.generate(null)'。在我看來,這是錯誤的行爲。 – Radoslav

0

你通過null作爲參數,那麼爲什麼不應該給NullPointerException? 在第17行,您應該給出適當的參數。

相關問題