PowerMock 模拟来自抽象的静态方法 class

PowerMock mock static method from abstract class

我在 Stack 上看到了这个问题的另一个例子,但没有答案。谁能根据经验(或任何其他深奥的方法)告诉我这是否可行?我遵循了所有我能找到的模拟静态方法的示例,但还没有找到适用于抽象静态方法的示例 类。两种方法因 MissingMethodInvocationException 而失败:

File[] files = {goodFile, badFile};
PowerMockito.mockStatic(AbstractFileImporter.class);

// fails with MissingMethodInvocationException
PowerMockito.when(AbstractFileImporter.getFiles(".")).thenReturn(files);

并且:

// fails with MissingMethodInvocationException
BDDMockito.given(AbstractFileImporter.getFiles(".")).willReturn(files);

而此方法因 IllegalStateException 而失败:

// fails with IllegalStateException
expect(AbstractFileImporter.getFiles(".")).andReturn(files);

我对模拟还很陌生,所以任何建议或好的站点链接都可以用作资源,同时艰难地完成所有这些都会非常有帮助。顺便说一下,我在重构方面确实有一些余地,但在使用不同的 tools/utilities 方面没有余地,所以我坚持使用 Mockito/PowerMock 和 TestNG。

我尝试在一个简单的抽象中模拟一个静态方法 class,它成功了。

我使用 https://code.google.com/p/powermock/wiki/MockitoUsage13 作为用法示例。

这是我的示例代码:

使用静态方法抽象 class:

public abstract class AbstractAnimal {

    public static String getHello() {
        return "Hello animal world!";
    }

}

测试 class 模拟:

import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

@RunWith(PowerMockRunner.class)
@PrepareForTest(AbstractAnimal.class)
public class AbstractAnimalTest {

    @Test
    public void shouldGetMockedHello() {
        PowerMockito.mockStatic(AbstractAnimal.class);
        Mockito.when(AbstractAnimal.getHello()).thenReturn("Hello mocked animal world!");

        String greetings = AbstractAnimal.getHello();
        Assert.assertTrue("Hello mocked animal world!".equals(greetings));
    }

}

POM 文件,如果您对具体的依赖项感兴趣:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.gnollix.Whosebug</groupId>
    <artifactId>mock-static-abstract</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <properties>
        <powermock.version>1.6.1</powermock.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        <dependency>
            <groupId>org.powermock</groupId>
            <artifactId>powermock-module-junit4</artifactId>
            <version>${powermock.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.powermock</groupId>
            <artifactId>powermock-api-mockito</artifactId>
            <version>${powermock.version}</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

</project>

希望对您有所帮助。

好的,我尝试将我的示例转换为 TestNG,在遵循 https://code.google.com/p/powermock/wiki/TestNG_usage 中的示例后,它对我有用。

我得到了你在省略必需的测试时提到的 MissingMethodInvocationException class 注释 @PrepareForTest(AbstractAnimal.class)

我正在使用带有 TestNG 插件版本 6.8.6 的 eclipse 4.4.1。

请参阅下面的转换示例和依赖项。 另外,请注意 PowerMockTestCase 的扩展名。 我没有更改示例 class AbstractAnimal.

import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.testng.PowerMockTestCase;
import org.testng.Assert;
import org.testng.annotations.Test;

@PrepareForTest(AbstractAnimal.class)
public class AbstractAnimalTest extends PowerMockTestCase {

    @Test
    public void shouldGetMockedHello() {
        PowerMockito.mockStatic(AbstractAnimal.class);
        PowerMockito.when(AbstractAnimal.getHello()).thenReturn("Hello mocked animal world!");

        String greetings = AbstractAnimal.getHello();
        Assert.assertTrue(greetings.equals("Hello mocked animal world!"));
    }

}

依赖项(我尝试使用你的版本):

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.gnollix.Whosebug</groupId>
    <artifactId>mock-static-abstract</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>org.testng</groupId>
            <artifactId>testng</artifactId>
            <version>6.8.8</version>
        </dependency>
        <dependency>
            <groupId>org.powermock</groupId>
            <artifactId>powermock-module-testng</artifactId>
            <version>1.5.6</version>
        </dependency>
        <dependency>
            <groupId>org.powermock</groupId>
            <artifactId>powermock-api-mockito</artifactId>
            <version>1.5.6</version>
        </dependency>
    </dependencies>

</project>

已解决的依赖项:

希望有用!