2010-02-08 15 views
0

Je reçois un NullPointerException lorsque je tente d'utiliser un fichier moqué avec JMockit:NullPointerException Utiliser JMockit pour tester deux fois raillé java.io.File

package com.metamolecular.poobah.test; 
import java.io.File; 
import junit.framework.TestCase; 
import mockit.Expectations; 
import mockit.Mocked; 

public class MockedFileTest extends TestCase 
{ 
    @Mocked File file; 

    public void testMockedFileCanBeUsed1() throws Exception 
    { 
    new Expectations() 
    { 
     { 
     file.list(); 
     result = null; 
     } 
    }; 
    file.list(); 
    } 
    public void testMockedFileCanBeUsed2() throws Exception 
    { 
    new Expectations() 
    { 
     { 
     file.list(); 
     result = null; 
     } 
    }; 
    file.list(); 
    } 
} 

Ma sortie est:

[java] 1) testMockedFileCanBeUsed2(com.metamolecular.poobah.test.MockedFileTest)java.lang.NullPointerException 
[java]  at java.io.FilePermission.init(FilePermission.java:193) 
[java]  at java.io.FilePermission.<init>(FilePermission.java:249) 
[java]  at sun.net.www.protocol.file.FileURLConnection.getPermission(FileURLConnection.java:198) 
[java]  at sun.net.www.protocol.jar.JarFileFactory.getPermission(JarFileFactory.java:124) 
[java]  at sun.net.www.protocol.jar.JarFileFactory.getCachedJarFile(JarFileFactory.java:94) 
[java]  at sun.net.www.protocol.jar.JarFileFactory.get(JarFileFactory.java:50) 
[java]  at sun.net.www.protocol.jar.JarURLConnection.connect(JarURLConnection.java:104) 
[java]  at sun.net.www.protocol.jar.JarURLConnection.getInputStream(JarURLConnection.java:132) 
[java]  at java.net.URL.openStream(URL.java:1010) 
[java]  at java.lang.ClassLoader.getResourceAsStream(ClassLoader.java:1232) 
[java]  at mockit.internal.ClassFile.readClass(ClassFile.java:55) 
[java]  at mockit.internal.ClassFile.createClassFileReader(ClassFile.java:44) 
[java]  at mockit.internal.ClassFile.<init>(ClassFile.java:72) 
[java]  at mockit.internal.RedefinitionEngine.restoreOriginalDefinition(RedefinitionEngine.java:316) 
[java]  at mockit.internal.state.MockFixture.restoreAndRemoveRedefinedClasses(MockFixture.java:174) 
[java]  at mockit.internal.state.SavePoint.restoreClassesRedefinedAfterSavepoint(SavePoint.java:77) 
[java]  at mockit.internal.state.SavePoint.rollback(SavePoint.java:57) 
[java]  at mockit.internal.state.SavePoint.rollbackForTestClass(SavePoint.java:89) 
[java]  at mockit.integration.TestRunnerDecorator.updateTestClassState(TestRunnerDecorator.java:54) 
[java]  at mockit.integration.junit3.internal.JUnitTestCaseDecorator.runBare(JUnitTestCaseDecorator.java:81) 
[java]  at com.metamolecular.poobah.test.Main.main(Main.java:45) 
[java] 
[java] FAILURES!!! 
[java] Tests run: 2, Failures: 0, Errors: 1 
[java] 

L'erreur se produit uniquement lorsque testMockedFileCanBeUsed2 est appelé. Si un seul test est exécuté, aucune erreur n'est générée. Je vois ce comportement à travers les suites de tests - en d'autres termes, si j'utilise un fichier simulé une fois dans une suite de tests, d'autres suites de tests utilisant un fichier mocké seront également lancées.

Pas vraiment familier avec JMockit et il est possible que je fasse juste quelque chose de stupide - mais je ne l'ai pas vu avec d'autres objets mockés que j'ai utilisés.

Des idées?

Répondre

2

Ce problème se produit avec JDK 1.6.0_18, en raison des optimisations que Sun a introduites dans le mécanisme de chargement de classe. Il a été corrigé dans JMockit il y a un moment.

Essayez la version apercu de la version 0.997, il fonctionnera: http://code.google.com/p/jmockit/downloads/list