Mockito Powermockito Static Mocking ClassNotPreparedException при запуске через ANT - PullRequest
0 голосов
/ 18 января 2019

У меня есть странная ситуация, когда этот тест проходит при запуске через IDE, но при запуске через ANT он завершается неудачей с исключением, отмеченным ниже. Я включил мои тестовые классы и цель муравья в качестве примера.

org.powermock.api.mockito.ClassNotPreparedException
The class simple.StaticStuff not prepared for test.
at org.powermock.api.mockito.expectation.reporter.MockitoPowerMockReporter.classNotPrepared(MockitoPowerMockReporter.java:32)
at org.powermock.api.mockito.internal.mockcreation.MockTypeValidatorFactory$DefaultMockTypeValidator.validate(MockTypeValidatorFactory.java:38)

С первого взгляда очевидным ответом было бы то, что ... ну, классу не хватает соответствующих аннотаций, помеченных PowerMockito, и поэтому мы ожидаем, что он потерпит неудачу. Но вы должны увидеть из тестовых классов ниже, что это наиболее определенно помечено @PrepareForTest.

Я включил классы и тестовую цель муравья, которая отобразит эту проблему.

Я действительно в растерянности, куда идти в этот момент. Я поменял версии банок, заменил время выполнения муравьев, упростил тестовые случаи, помолился всем и каждому богам и переместил свою рабочую станцию ​​в область с лучшим фен-шуй, но все безрезультатно.

  • Java 1.8.181
  • ANT Runtime 1.10.5 (в настоящее время текущий)

        <junit fork="yes" printsummary="yes" haltonfailure="no" showoutput="no" failureproperty="test:failure">
            <jvmarg value="-Xms128m" />
            <jvmarg value="-Xmx1024m" />
             <classpath>
                <pathelement location="e:\testCompile" />
                <pathelement location="E:\lib\junit-4.12.jar" />
                <pathelement location="E:\lib\powermock-api-mockito-1.7.4.jar" />
                <pathelement location="E:\lib\powermock-api-support-1.7.4.jar" />
                <pathelement location="E:\lib\powermock-module-junit4-1.7.4.jar" />
                <pathelement location="E:\lib\powermock-api-mockito-common-1.7.4.jar" />
                <pathelement location="E:\lib\powermock-core-1.7.4.jar" />
                <pathelement location="E:\lib\mockito-all-1.10.19.jar" />
                <pathelement location="E:\lib\powermock-module-junit4-common-1.7.4.jar" />
            </classpath>
            <formatter type="xml" />
            <batchtest fork="yes" todir="${test.report.dir}">
                <fileset dir="${srctest.java}">
                    <include name="simple\TestSimpleStatic.java" />
                </fileset>
            </batchtest>
            </junit>
            <junitreport todir="${test.report.dir}">
                <fileset dir="${test.report.dir}">
                    <include name="${test.report.files}" />
                </fileset>
                <report format="noframes" todir="${test.report.dir}" />
            </junitreport>
      </target>
    

Тестовые классы

package simple;

import static org.assertj.core.api.Assertions.assertThat;
import org.junit.runner.RunWith;
import org.mockito.MockitoAnnotations;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

import junit.framework.TestCase;

@RunWith(PowerMockRunner.class) // Need for static mocking
@PrepareForTest(StaticStuff.class) // Classes to be static mocked
public class TestSimpleStatic extends TestCase {

    @Override
    protected void setUp() throws Exception {
        super.setUp();
    }

    public void testWorks() {
        String expected = "works";
        String actual = "works";
        assertThat(actual).isEqualTo(expected);
    }

    public void testStatic() {
        PowerMockito.mockStatic(StaticStuff.class);
        MockitoAnnotations.initMocks(this);
        String expected = "new Stuff";
        PowerMockito.when(StaticStuff.doGet()).thenReturn(expected);
        String actual = StaticStuff.doGet();
        assertThat(actual).isEqualTo(expected);
    }
}

Тестируемый класс

package simple;

public class StaticStuff {

    public static String doGet() {
        return "from static";
    }
}
...