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

时间:2015-01-09 23:28:46

标签: java unit-testing abstract-class mockito powermock

我在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);

我很嘲笑,所以任何建议或良好的网站链接作为资源使用,同时跋涉所有这些将是非常有帮助的。顺便说一句,我在重构方面确实有一些余地,但是没有使用不同的工具/工具,所以我坚持使用Mockito / PowerMock和TestNG。

2 个答案:

答案 0 :(得分:4)

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

当我省略所需的测试类注释MissingMethodInvocationException时,我得到了您提及的@PrepareForTest(AbstractAnimal.class)

我使用eclipse 4.4.1和TestNG插件版本6.8.6。

请参阅下面的转换示例和依赖项。 另请注意PowerMockTestCase的扩展名。 我没有更改示例类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!"));
    }

}

Dependendencies(我试图使用你的版本):

<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.stackoverflow</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>

已解决的依赖项:

resolved dependencies

希望这很有用!

答案 1 :(得分:2)

我尝试在一个简单的抽象类中模拟一个静态方法,但它起作用了。

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

以下是我的示例代码:

使用静态方法的抽象类:

public abstract class AbstractAnimal {

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

}

模拟测试类:

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.stackoverflow</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>

希望有所帮助。