PowerMockito模拟间接静态方法



测试

public class Randomer {
    public int get() {
        return (int) Math.random() + 1;
    }
}

测试类

package org.samiron;
import static org.junit.Assert.assertEquals;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.api.support.membermodification.MemberMatcher;
import org.powermock.api.support.membermodification.MemberModifier;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import org.testng.annotations.Test;
/**
 * @author samiron
 *
 */
@RunWith(PowerMockRunner.class)
@PrepareForTest({ Randomer.class, Math.class })
public class RandomerTest {
    @Test
    public void shouldAddUpDieRollsCorrectly() throws Exception {
        PowerMockito.spy(Math.class);
        MemberModifier.stub(MemberMatcher.method(Math.class, "random")).toReturn(2.0);
        Randomer d = new Randomer();
        assertEquals(3, d.get());
    }
}

总是获得java.lang.AssertionError: expected:<3> but was:<1>

这里怎么了?老实说,每当我遇到嘲笑静态功能的情况时,我都会尝试找到一种方法而不是浪费时间。因此,需要您的帮助来找出确切的解决方案。

示例类的唯一目的是证明Math.random()函数未被模拟,因此不返回所需的值。

常规实现

嘲笑是编写测试时的每个基本工具。尽管对实例进行嘲笑的效果很大,但是嘲笑静态方法似乎是一个真正的复杂,这是如此多的嘲笑库的组合以及如此多的选择仅支持很少的简单场景。这应该简化。

使用的库:

  • Mockito-All-1.9.5.jar
  • PowerMock-Mockito-Release-Full-1.5.1-full.jar

此测试通过,从而证明了静态调用Math.random() IS 成功模拟了:

@RunWith(PowerMockRunner.class)
// tell PowerMock about (a) the class you are going to test and (b) the class you are going to 'mock static'
@PrepareForTest({Randomer.class, Math.class })
public class RandomerTest {
    @Test
    public void shouldAddUpDieRollsCorrectly() throws Exception {
        // prepare PowerMock for mocking statics on Math
        PowerMockito.mockStatic(Math.class);
        // establish an expectation for what Match.random() should return
        PowerMockito.when(Math.random()).thenReturn(2.0);
        Randomer d = new Randomer();
        assertEquals(3, d.get());
    }
}

问题与您在问题中发布的主要区别是我正在使用...

  • PowerMockito.mockStatic(Math.class)PowerMockito.when(Math.random()).thenReturn(2.0)

...而不是:

  • PowerMockito.spy(Math.class)MemberModifier.stub(MemberMatcher.method(Math.class, "random")).toReturn(2.0)

另外,在您的OP中,示例代码使用JUNIT(org.powermock.modules.junit4.PowerMockRunner)和TestNG(org.testng.annotations.Test)的混合物,而在我的示例中,我只是在使用Junit。

上面已用

验证
  • junit:4.12
  • powermock-module-junit4:1.7.0
  • powermock-api-mockito2:1.7.0

这里似乎有一个库不匹配。

在您说的评论中使用以下依赖关系(不带Maven的便利性):

<dependency>
  <groupId>org.mockito</groupId>
  <artifactId>mockito-all</artifactId>
  <version>1.9.5</version>
  <scope>test</scope>
</dependency>
<dependency>
  <groupId>org.powermock</groupId>
  <artifactId>powermock-mockito-release-full</artifactId>
  <version>1.5.1</version>
  <scope>test</scope>
</dependency>

我使用这些代码工作:

<dependency>
  <groupId>org.powermock</groupId>
  <artifactId>powermock-module-junit4</artifactId>
  <version>1.7.0</version>
  <scope>test</scope>
</dependency>
<dependency>
  <groupId>org.powermock</groupId>
  <artifactId>powermock-api-mockito</artifactId>
  <version>1.7.0</version>
  <scope>test</scope>
</dependency>

相关内容

  • 没有找到相关文章

最新更新