PowerMockito 模拟单个静态方法和返回对象 [英] PowerMockito mock single static method and return object

查看:75
本文介绍了PowerMockito 模拟单个静态方法和返回对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想从一个包含 2 个静态方法 m1 和 m2 的类中模拟一个静态方法 m1.我希望方法 m1 返回一个对象.

我尝试了以下

1)

PowerMockito.mockStatic(Static.class, new Answer() {@覆盖public Long answer(InvocationOnMock invocation) 抛出 Throwable {返回 1000 升;}});

这会同时调用 m1 和 m2,它们具有不同的返回类型,因此会出现返回类型不匹配错误.

2) PowerMockito.when(Static.m1(param1, param2)).thenReturn(1000l);但是在执行 m1 时不会调用这个.

3) PowerMockito.mockPartial(Static.class, "m1");给出了 mockPartial 不可用的编译器错误,这是我从 http://code.google.com 得到的/p/powermock/wiki/MockitoUsage.

解决方案

你要做的是将部分 1 和全部 2 结合起来.

您需要使用 PowerMockito.mockStatic 为类的所有静态方法启用静态模拟.这意味着可以可以使用 when-thenReturn 语法对它们进行存根.

但是,当您调用未在模拟实例上显式存根的方法时,您正在使用的 mockStatic 的 2 参数重载为 Mockito/PowerMock 应执行的操作提供了默认策略.

来自 javadoc:><块引用>

使用指定的策略创建类模拟以获取答案相互作用.这是一项非常先进的功能,通常您不需要它来编写体面的测试.但是,在使用时它可能会有所帮助遗留系统.这是默认答案,因此仅在以下情况下使用你不存根方法调用.

默认 默认存根策略是只为对象、数字和布尔值方法返回 null、0 或 false.通过使用 2-arg 重载,您会说不,不,不,默认情况下使用此 Answer 子类的答案方法来获取默认值.它返回一个 Long,因此如果您有返回与龙,有问题.

相反,使用 1-arg 版本的 mockStatic 来启用静态方法的存根,然后使用 when-thenReturn 指定要为特定方法执行的操作.例如:

import static org.mockito.Mockito.*;导入 org.junit.Test;导入 org.junit.runner.RunWith;导入 org.mockito.invocation.InvocationOnMock;导入 org.mockito.stubbing.Answer;导入 org.powermock.api.mockito.PowerMockito;导入 org.powermock.core.classloader.annotations.PrepareForTest;导入 org.powermock.modules.junit4.PowerMockRunner;类 ClassWithStatics {公共静态字符串 getString() {返回字符串";}公共静态 int getInt() {返回 1;}}@RunWith(PowerMockRunner.class)@PrepareForTest(ClassWithStatics.class)公共类 StubJustOneStatic {@测试公共无效测试(){PowerMockito.mockStatic(ClassWithStatics.class);when(ClassWithStatics.getString()).thenReturn("Hello!");System.out.println("字符串:" + ClassWithStatics.getString());System.out.println("Int:" + ClassWithStatics.getInt());}}

字符串值静态方法被存根返回Hello!",而整数值静态方法使用默认存根,返回0.

I want to mock a static method m1 from a class which contains 2 static methods, m1 and m2. And I want the method m1 to return an object.

I tried the following

1)

PowerMockito.mockStatic(Static.class, new Answer<Long>() {
         @Override
         public Long answer(InvocationOnMock invocation) throws Throwable {
            return 1000l;
         }
      });

This is calling both m1 and m2, which has a different return type, so it gives a return type mismatch error.

2) PowerMockito.when(Static.m1(param1, param2)).thenReturn(1000l); But this is not called when m1 is executed.

3) PowerMockito.mockPartial(Static.class, "m1"); Gives compiler error that mockPartial not available, which I got from http://code.google.com/p/powermock/wiki/MockitoUsage.

解决方案

What you want to do is a combination of part of 1 and all of 2.

You need to use the PowerMockito.mockStatic to enable static mocking for all static methods of a class. This means make it possible to stub them using the when-thenReturn syntax.

But the 2-argument overload of mockStatic you are using supplies a default strategy for what Mockito/PowerMock should do when you call a method you haven't explicitly stubbed on the mock instance.

From the javadoc:

Creates class mock with a specified strategy for its answers to interactions. It's quite advanced feature and typically you don't need it to write decent tests. However it can be helpful when working with legacy systems. It is the default answer so it will be used only when you don't stub the method call.

The default default stubbing strategy is to just return null, 0 or false for object, number and boolean valued methods. By using the 2-arg overload, you're saying "No, no, no, by default use this Answer subclass' answer method to get a default value. It returns a Long, so if you have static methods which return something incompatible with Long, there is a problem.

Instead, use the 1-arg version of mockStatic to enable stubbing of static methods, then use when-thenReturn to specify what to do for a particular method. For example:

import static org.mockito.Mockito.*;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

class ClassWithStatics {
  public static String getString() {
    return "String";
  }

  public static int getInt() {
    return 1;
  }
}

@RunWith(PowerMockRunner.class)
@PrepareForTest(ClassWithStatics.class)
public class StubJustOneStatic {
  @Test
  public void test() {
    PowerMockito.mockStatic(ClassWithStatics.class);

    when(ClassWithStatics.getString()).thenReturn("Hello!");

    System.out.println("String: " + ClassWithStatics.getString());
    System.out.println("Int: " + ClassWithStatics.getInt());
  }
}

The String-valued static method is stubbed to return "Hello!", while the int-valued static method uses the default stubbing, returning 0.

这篇关于PowerMockito 模拟单个静态方法和返回对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆