为了账号安全,请及时绑定邮箱和手机立即绑定

请问一下java单元测试怎样消除mock静态方法对普通方法的影响?

请问一下java单元测试怎样消除mock静态方法对普通方法的影响?

收到一只叮咚 2019-08-20 17:13:26
java单元测试怎样消除mock静态方法对普通方法的影响
查看完整描述

3 回答

?
慕田峪4524236

TA贡献1875条经验 获得超5个赞

有一些方法会依赖于第三方的包,例如在service方法中我们有可能会去调用数据库的执行结果,会取redis中缓存数据,也有可能会使用当前的系统时间,根据系统时间做一些逻辑处理。虽然方法的逻辑依赖于第三方的东西,但是我们的单元测试却不能依赖于第三方的东西,你不可能用单元测试去测试数据库是不是可靠的,数据库的可靠性不是单元测试的目的, 这时候我们就要模仿数据库等第三方包的行为,让这些第三方包返回我们想要的东西,从而将依赖关系简单化,只测试我们自己的

查看完整回答
反对 回复 2019-08-24
?
POPMUISE

TA贡献1765条经验 获得超5个赞

传统的JMock是无法Mock静态方法的,但是Jmockit能够很好地Mock类的静态方法。

[java] view plain copy
package features.jmockit.staticmock;

public class StaticTarget {

public static int m1() {
throw new RuntimeException();
}

public static String m2() {
throw new RuntimeException();
}

}



查看完整回答
反对 回复 2019-08-24
?
慕妹3242003

TA贡献1824条经验 获得超6个赞

因为Mockito使用继承的方式实现mock的,用CGLIB生成mock对象代替真实的对象进行执行,为了mock实例的方法,你可以在subclass中覆盖它,而static方法是不能被子类覆盖的,所以Mockito不能mock静态方法。
但PowerMock可以mock静态方法,因为它直接在bytecode上工作,类似这样:
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 {

查看完整回答
反对 回复 2019-08-24
  • 3 回答
  • 0 关注
  • 1315 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信