2015-01-09 930 views
0

我在堆栈上看到了这个问题的另一个例子,但没有答案。任何人都可以根据经验(或任何其他深奥的手段)告诉我,如果这甚至可以做到?我已经遵循了所有可以找到我可以找到的嘲讽静态方法的例子,但是还没有发现可用于抽象类中的静态方法的例子。两种方法失败,MissingMethodInvocationException:PowerMock模拟抽象类的静态方法

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中。

回答

3

好的,我试图将我的示例转换为TestNG,并在https://code.google.com/p/powermock/wiki/TestNG_usage的示例后面为我工作。

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

我使用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

希望这是有用的!

+0

感谢Bastian,就是这样,这个类没有被列为扩展PowerMockTestCase。我不能相信我错过了检查,但它是另一个球队的代码,所以......我猜他们没有按照他们应该的那样小心遵守公司的标准。 – idclaar 2015-01-14 20:28:08

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> 

希望有所帮助。

+0

感谢您的快速检查Bastian。我终于开始在本地运行,而且你是对的,只要我使用JUnit,这个工作就完美了。只要我将它转换为TestNG,它就会和我的测试一样失败,所以我想我已经回到了原点。我们目前在我们的技术堆栈中粘贴TestNG。 TestNG和JUnit之间的这种行为差异是否会引发任何人对可能的解决方法的回忆? – idclaar 2015-01-13 19:48:59

+0

由此,testng版本使用6.8.8,powermock-core为1.5.6,powermock-module-testng-common和agent都为1.5.6。 powermock-core使用的javassist是3.18.2-GA。如果任何人看起来这些版本有问题,请加入!谢谢! – idclaar 2015-01-13 22:21:38