NullPointerException Использование JMockit для проверки макета java.io.File Дважды - PullRequest
0 голосов
/ 08 февраля 2010

Я получаю исключение NullPointerException при попытке использовать фиктивный файл с JMockit :

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

Мой вывод:

 [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] 

Ошибка возникает только при вызове testMockedFileCanBeUsed2. Если выполняется только один тест, ошибка не выдается. Я наблюдаю такое поведение в тестовых наборах - иными словами, если я один раз использую макетированный файл в тестовом наборе, другие тестовые наборы, использующие макетированный файл, также выдают.

Не совсем знаком с JMockit, и, возможно, я просто делаю что-то глупое - но я не видел этого с другими поддельными объектами, которые я использовал.

Есть идеи?

1 Ответ

2 голосов
/ 10 февраля 2010

Эта проблема возникает с JDK 1.6.0_18 из-за оптимизаций, которые Sun ввела в механизм загрузки классов. Это было исправлено в JMockit некоторое время назад.

Попробуйте текущий предварительный выпуск версии 0.997, он будет работать: http://code.google.com/p/jmockit/downloads/list

...