当前位置: 首页 > 知识库问答 >
问题:

final类中的Powermock静态final方法

盖锐进
2023-03-14

我为之编写的测试用例:

public class AClassUnderTest {

    // This test class has a method call
    public Long methodUnderTest() {

         // Uses the FinalUtilityClass which contains static final method
         FinalUtilityClass.myStaticFinalMethod(<3-parameters-here>);

         // I want to mock above call so that test case for my "methodUnderTest" passes
    }
}

我还有最后一节课。

public final class FinalUtilityClass {

   /**
    * Method has 3 parameters
    */
   public static final MyBean myStaticFinalMethod(<3-parameters-here>) {

   }
}

我已经在测试类中添加了以下代码:

@RunWith(PowerMockRunner.class)
@PrepareForTest({ FinalUtilityClass.class })
PowerMockito.mock(FinalUtilityClass.class)
PowerMockito.when(FinalUtilityClass.myStaticFinalMethod(<3-parameters-here>).thenReturn(new MyBean());
PowerMockito.mockStatic(FinalUtilityClass.class)
PowerMockito.when(FinalUtilityClass.myStaticFinalMethod(<3-parameters-here>).thenReturn(new MyBean());
PowerMockito.spy(FinalUtilityClass.class)
PowerMockito.when(FinalUtilityClass.myStaticFinalMethod(<3-parameters-here>).thenReturn(new MyBean());

但对我来说什么都不起作用。请建议在final类中模仿static final方法的正确方法。

共有1个答案

伍胡媚
2023-03-14

模拟对静态方法的调用需要执行以下步骤:

  • 在测试用例的类级别使用@runwith(powermockrunner.class)注释。
  • 在测试用例的类级别使用@preparefortest(classthatcontainsstaticmethod.class)注释
  • 使用PowerMock.mockStatic(ClassThatContainsStaticMethod.class)模拟该类的所有方法

当您按照文档中的步骤执行这些步骤时,您的测试应该可以工作了。正如OP似乎对PowerMock和PowerMockito感到困惑--这(或多或少)是同样的事情:

package ghostcat.test;

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;

final class ClassWithStatic {
    public final static int ignoreMethodCall(String a, String b, int c) {
        System.out.println("SHOULD NOT SHOW UP: " + a);
        return c;
    }
}

@RunWith(PowerMockRunner.class)
@PrepareForTest(ClassWithStatic.class)
public class MockStaticTest {
    @Test
    public void test() {
        PowerMockito.mockStatic(ClassWithStatic.class);
        PowerMockito.when(ClassWithStatic.ignoreMethodCall("a", "b", 5)).thenReturn(42);
        org.junit.Assert.assertEquals(ClassWithStatic.ignoreMethodCall("a", "b", 5), 42);
    }
}
 类似资料:
  • 我的问题与这个问题基本相同,但这也适用于函数吗? 我想明白: 编译器是否将类中的所有函数视为? 在类中的函数中添加关键字是否有任何影响?

  • Java不允许类的静态方法被重写。因此,如果一个超类方法是静态的,那么子类中的同名方法也需要是静态的,具有相同的签名才能编译,尽管它不是一个方法重写。下面是一个例子: 但我的问题是,所以如果这不是方法重写,那么为什么我不能使超级类中的静态方法final?

  • 我用的是同一种概念,我在第一节课上用过 但当我运行类Test2时,它给出了输出5。 我想知道初始化是什么时候发生的?我知道静态变量在编译时获得值。但是静态决赛呢?这个变量什么时候得到它的值?

  • final:类似于C++中的const参数。这基本上意味着值(或方法中返回的值)不会改变。 静态:表示值(或方法)不直接赋给某个对象--因此您可以在其他类中使用静态变量(或方法),而无需创建对象 final static:这种组合是否意味着您有变量(或方法),您可以在不创建对象(static)的情况下访问它,并且您不能更改它的值(就像在C++常量中)(final) 如果我是对的,比我没有得到一件事

  • 问题内容: 在Java中,两者之间有什么区别? 和 都是和,不同之处在于属性。 有什么更好的?又为什么呢? 问题答案: 通常,是指“与类型本身相关联,而不是与类型实例相关联”。 这意味着你可以在没有创建类型实例的情况下引用静态变量,并且任何引用该变量的代码都引用完全相同的数据。将其与实例变量进行比较:在这种情况下,该类的每个实例都有一个独立的变量版本。因此,例如: 打印出并且是分开的,因为x和y引

  • 要通过这个测试,必须做的绝对最小的嘲笑是什么? 代码: 测试: 相关:在测试类中模拟私有静态最终变量(没有明确答案)