【发布时间】:2017-09-15 08:29:23
【问题描述】:
要测试的类
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()调用封装在可以正确模拟的类/方法中? -
另外,
Math.random()应该返回一个介于[0.0...1.0)之间的值。那你为什么要嘲笑返回2.0的方法呢? -
您的代码对我有用。你的依赖是什么?
-
@LucianovanderVeekens 我用我正在使用的罐子更新了 OP,可能是我使用的组合有问题。不幸的是,这里没有专家(请不要感到震惊!)。
标签: java unit-testing junit mockito powermock