我在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。
答案 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>
已解决的依赖项:
希望这很有用!
答案 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>
希望有所帮助。