2015-06-14 118 views
0

我收到此錯誤:PowerMock連連初始化錯誤

java.lang.ExceptionInInitializerError 
    at java.lang.Class.forName0(Native Method) 
    at java.lang.Class.forName(Unknown Source) 
    at javassist.runtime.Desc.getClassObject(Desc.java:43) 
    at javassist.runtime.Desc.getClassType(Desc.java:152) 
    at javassist.runtime.Desc.getType(Desc.java:122) 
    at javassist.runtime.Desc.getType(Desc.java:78) 
    at mh.scene.terrain.MapReaderTestNew.testAcceptValidFilenames(MapReaderTestNew.java:26) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at org.junit.internal.runners.TestMethod.invoke(TestMethod.java:68) 
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:310) 
    at org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:88) 
    at org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:96) 
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.executeTest(PowerMockJUnit44RunnerDelegateImpl.java:294) 
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTestInSuper(PowerMockJUnit47RunnerDelegateImpl.java:127) 
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTest(PowerMockJUnit47RunnerDelegateImpl.java:82) 
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runBeforesThenTestThenAfters(PowerMockJUnit44RunnerDelegateImpl.java:282) 
    at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:86) 
    at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:49) 
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.invokeTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:207) 
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.runMethods(PowerMockJUnit44RunnerDelegateImpl.java:146) 
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$1.run(PowerMockJUnit44RunnerDelegateImpl.java:120) 
    at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:33) 
    at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:45) 
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.run(PowerMockJUnit44RunnerDelegateImpl.java:122) 
    at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:106) 
    at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run(AbstractCommonPowerMockRunner.java:53) 
    at org.powermock.modules.junit4.PowerMockRunner.run(PowerMockRunner.java:59) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192) 
Caused by: java.lang.NullPointerException 
    at mh.scene.terrain.TMXMapReader.<clinit>(TMXMapReader.java:84) 
    ... 36 more 

這是一個非常著名的問題。問題是我找不到一個工作良好的解決方案。測試的代碼是這樣的:

package mh.scene.terrain; 

import static org.easymock.EasyMock.createMock; 
import static org.junit.Assert.assertEquals; 
import static org.junit.Assert.assertFalse; 
import static org.junit.Assert.assertTrue; 

import java.io.File; 

import mh.CachedResources; 
import mh.scene.entity.player.EntityPlayerLocal; 

import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.powermock.api.easymock.PowerMock; 
import org.powermock.core.classloader.annotations.PrepareForTest; 
import org.powermock.modules.junit4.PowerMockRunner; 

@SuppressWarnings("javadoc") 
@RunWith(PowerMockRunner.class) 
//@PrepareForTest(CachedResources.class) 
public class MapReaderTestNew { 
    @Test 
    public void testAcceptValidFilenames() { 
     // Arrange 
     TMXMapReader reader = new TMXMapReader(); 

     // Assert 
     assertTrue(reader.accept(new File("example.tmx"))); 
     assertTrue(reader.accept(new File("/tmp/example.tmx"))); 
     assertTrue(reader.accept(new File("/tmp/example.tsx"))); 
     assertTrue(reader.accept(new File("/tmp/example.tmx.gz"))); 
     assertFalse(reader.accept(new File("/tmp/example.txt"))); 
     assertFalse(reader.accept(new File("/tmp/example.xml"))); 
     assertFalse(reader.accept(new File("/tmp/example.exe"))); 
     assertFalse(reader.accept(new File("/tmp/example"))); 
    } 

    @Test 
    public void testReadingMapExample() throws Exception { 


     EntityPlayerLocal pl = createMock(EntityPlayerLocal.class); 
     Map map = new TMXMapReader().readMap("/sewers.tmx", null, pl); 

//  PowerMock.mockStatic(CachedResources.class); 
//  PowerMock.replay(CachedResources.class); 

     assertEquals(50, map.getHeight()); 
     assertEquals(50, map.getWidth()); 
     assertEquals(1, map.getTilesetCount()); 
     assertEquals(3, map.getLayerCount()); 
     assertEquals(1, map.getObjectsetCount()); 
    } 
} 

這是非常簡單的,甚至是刪除「PowerMock.mockStatic()」的錯誤出現,當我加入RunWith

任何想法?


的問題似乎是在這部分代碼:

File JAR_FILE = (MagicHogwarts.class.getProtectionDomain().getCodeSource().getLocation() == null ? null : new File(MagicHogwarts.class.getProtectionDomain().getCodeSource().getLocation().getPath())); 

返回一個空。處理可通過powermock測試的路徑的正確方法是什麼?當我使用的語句「RunWith」

+1

那麼第42行是什麼? – Makoto

+0

我編輯了我的帖子,完整的堆棧和測試類。 – Gianmarco

回答

0

嘗試添加該註釋

@SuppressStaticInitializationFor({"package.YourClass"}) 

爲了嘲笑特定誤差僅拋出靜態你需要它powermockito知道它需要爲部分抑制靜更改字節碼

+2

爲了清楚起見,你能否在答案中增加幾句話來解釋_爲什麼這會解決OP的問題? –

0

您可能還需要將EntityPlayerLocal.class添加到@PrepareForTest()createMock(EntityPlayerLocal.class)方法導致我猜的問題。 你可以檢查一次寫入的代碼嗎?如果你可以在你的問題中粘貼這種方法會更好。

+0

我會盡快嘗試,但是,即使是標準模擬,每個類都要添加到PrepareForTest(其中會有很多)。對我來說似乎很奇怪 – Gianmarco

+0

不,每個類都不需要添加到'@PrepareForTest()'中,只需要添加在測試中被模擬的靜態類。由於createMock()方法中的代碼對我來說是不可見的,我猜測並假定它有很多靜態模擬。 – 2015-06-16 12:48:31

+0

createMock()是powermock,mockito和easymock提供的一種方法,它只是在那裏導入靜態的。 – Gianmarco