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>
已解决的依赖项:
希望有用!
我在 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>
已解决的依赖项:
希望有用!