【问题标题】:Get Internal State Error using PowerMockito when running a JUnit test运行 JUnit 测试时使用 PowerMockito 获取内部状态错误
【发布时间】:2015-09-15 21:15:58
【问题描述】:

我正在尝试运行一个简单的 JUnit 测试

@RunWith(PowerMockRunner.class)
@PrepareForTest(DB2Connection.class)

    public class SomeClassTest {

    AnotherReqClass reqClassObject = null;
    private SomeClass dao;
    private DB2Connection connection = null;
    private Connection con = null;

    @BeforeClass
    public static void beforeClass(){

    //Getting some information from a settings XML file         
    }

    @Before
    public void setUp() throws Exception {

        //Mock the Connection class that contains the static method
        con = mock(Connection.class);

            //PowerMock the class that 
        PowerMockito.mockStatic(DB2Connection.class);
        when(DB2Connection.getDb2Connection()).thenReturn(con);

             //some Logic goes here
    }

    @Test
    public void testMethod(){

        String someString ="xyz";
        requiredClassObject = new AnotherRequiredClass(dao);
        try {           
                     //Some Logic
            assertEquals(//Something);

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }   
    }    
}

以下是堆栈跟踪:

org.powermock.reflect.exceptions.FieldNotFoundException: Field 'fTestClass' was not found in class org.junit.internal.runners.MethodValidator.
    at org.powermock.reflect.internal.WhiteboxImpl.getInternalState(WhiteboxImpl.java:643)
    at org.powermock.reflect.Whitebox.getInternalState(Whitebox.java:308)
    at org.powermock.modules.junit4.internal.impl.testcaseworkaround.PowerMockJUnit4MethodValidator.validateTestMethods(PowerMockJUnit4MethodValidator.java:79)
    at org.powermock.modules.junit4.internal.impl.testcaseworkaround.PowerMockJUnit4MethodValidator.validateInstanceMethods(PowerMockJUnit4MethodValidator.java:49)
    at org.junit.internal.runners.MethodValidator.validateMethodsForDefaultRunner(MethodValidator.java:51)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.validate(PowerMockJUnit44RunnerDelegateImpl.java:108)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.<init>(PowerMockJUnit44RunnerDelegateImpl.java:70)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl.<init>(PowerMockJUnit47RunnerDelegateImpl.java:42)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit49RunnerDelegateImpl.<init>(PowerMockJUnit49RunnerDelegateImpl.java:25)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.createDelegatorFromClassloader(JUnit4TestSuiteChunkerImpl.java:143)
    at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.createDelegatorFromClassloader(JUnit4TestSuiteChunkerImpl.java:39)
    at org.powermock.tests.utils.impl.AbstractTestSuiteChunkerImpl.createTestDelegators(AbstractTestSuiteChunkerImpl.java:217)
    at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.<init>(JUnit4TestSuiteChunkerImpl.java:59)
    at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.<init>(AbstractCommonPowerMockRunner.java:32)
    at org.powermock.modules.junit4.PowerMockRunner.<init>(PowerMockRunner.java:33)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:104)
at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:86)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass

(RunnerBuilder.java:59)
at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:26)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:33)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.<init>(JUnit4TestReference.java:33)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestClassReference.<init>(JUnit4TestClassReference.java:25)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createTest(JUnit4TestLoader.java:48)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.loadTests(JUnit4TestLoader.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:444)
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)

当我尝试运行测试时,我收到错误 org.powermock.reflect.internal.WhiteboxImpl.getInternalState(WhiteboxImpl.java:643)。任何建议将不胜感激。谢谢。

【问题讨论】:

标签: java junit powermock


【解决方案1】:

这是在您使用 JUnit 4.12 和 PowerMock

testCompile 'junit:junit:4.12',
            'org.powermock:powermock-core:1.6.1',
            'org.powermock:powermock-module-junit4:1.6.1',
            'org.powermock:powermock-api-mockito:1.6.1'

如果您无法升级 PowerMock,那么您可以使用 JUnit 4.11。

testCompile 'junit:junit:4.11',
            'org.powermock:powermock-core:1.5.6',
            'org.powermock:powermock-module-junit4:1.5.6',
            'org.powermock:powermock-api-mockito:1.5.6'

能否请您添加更多的堆栈跟踪行,以揭示有关问题的更多详细信息。

【讨论】:

  • 我为 4.12 添加了 1.6.1 但仍然是同样的错误。我在上面发布了整个堆栈跟踪。
  • 堆栈跟踪看起来不像您使用的是 1.6.1。 PowerMockJUnit4MethodValidator 的第 79 行在 1.6.1 中是空行:github.com/jayway/powermock/blob/…
  • 你好@Stefan Birkner.. 我在构建路径上添加了 junit 4.12 的三个 jar,但我仍然得到相同的堆栈跟踪。另外,我不明白第 79 行是空行是什么意思?请帮忙。 JUnit 测试失败,说测试类的初始化错误。
  • 成功了!错误消失了。有一个不同的参考库需要 1.6.1 jars。这样做之后,它就可以工作了。感谢您的帮助。
【解决方案2】:

根据您的 PowerMockito 和 JUnit 版本,可能会发生这种情况。

尝试使用这些依赖项:

  • 六月:4.11
  • powermock-api-mockito:1.5.6
  • powermock-module-junit4: 1.5.6

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-17
    • 2018-02-24
    • 1970-01-01
    • 1970-01-01
    • 2013-02-11
    • 2013-01-01
    • 1970-01-01
    相关资源
    最近更新 更多