java - NullPointerException 使用 JMockit 测试模拟 java.io.File 两次

标签 java bdd jmockit

当我尝试使用 JMockit 的模拟文件时,出现 NullPointerException :

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,可能我只是在做一些愚蠢的事情 - 但我还没有在我使用过的其他模拟对象中看到过这种情况。

有什么想法吗?

最佳答案

由于 Sun 在类加载机制中引入的优化,JDK 1.6.0_18 中会出现此问题。不久前它已在 JMockit 中修复。

尝试当前的预览版 0.997 版本,它会起作用: http://code.google.com/p/jmockit/downloads/list

关于java - NullPointerException 使用 JMockit 测试模拟 java.io.File 两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2224260/

相关文章:

php - 可以在尝试运行任何东西之前检查步骤是否已定义吗?

java - 如何在 Java 的步骤定义中使用 Cucumber 数据表中的变量名称?

java - JMockit 未正确初始化

java - 如何计算 Spring 测试中 Spring Boot 加载的次数?

java - 如何修复执行 EValidator 时发生的错误

java - 考虑将其中一个 bean 标记为 @Primary

java - 检查访问 token 的有效性而不需要往返授权服务器?

sql - 如何 - 在 SQL Server 中创建后直接创建和使用数据库?

java - 如何在 JMockit 中正确模拟私有(private) ExecutorService 的提交方法

java - 在 jmockit 中模拟被测类的私有(private)方法