PowerMockito 模拟单个静态方法并返回对象

问题描述 投票:0回答:2

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

我尝试了以下方法

1)

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

这同时调用了 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得到的。

java mockito powermock easymock
2个回答
163
投票

你想做的是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.*; 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()); } }

String 值静态方法被存根以返回“Hello!”,而 int 值静态方法使用默认存根,返回 0。
    

我使用 String 静态方法创建了一个单元测试:

0
投票
import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; @RunWith(PowerMockRunner.class) @PrepareForTest(String.class) public class PowerMockTest { @Test public void staticMethodMocking() { PowerMockito.mockStatic(String.class); PowerMockito.when(String.valueOf(false)).thenReturn("true"); Assert.assertEquals("true", String.valueOf(false)); } }


© www.soinside.com 2019 - 2024. All rights reserved.