使用PowerMock模拟多个类的静态方法

112

我知道如何使用PowerMock来模拟类中静态方法。
但我想在测试类中使用JUnit和PowerMock模拟多个类中的静态方法。

请问有人能告诉我是否可能做到这一点,以及如何做到?


1
你只需要像模拟单个类的方法一样去做就可以了。你卡在哪里了? - artbristol
当使用PowerMock时,您需要将此注释添加到测试类@PrepareForTest(ClassThatContainsStaticMethod.class)。但是我们无法指定多个注释。那么该怎么办呢? - Newbie
4个回答

272

对于多个类,请只需执行 @PrepareForTest({Class1.class,Class2.class})


12
花括号!这就是我所缺少的。 - sudocoder
2
同时不要忘记在类级别上使用 @RunWith(PowerMockRunner.class) 切换到 PowerMockRunner。 - Nikita Barishok
1
@NikitaBarishok 不是必需的。相反,您可以定义一个规则来使上述工作-@Rule public PowerMockRule rule = new PowerMockRule(); - Aniket Thakur
5
在 Kotlin 中,@PrepareForTest(Class1::class, Class2::class) 表示需要为 Class1Class2 进行测试准备。 - Ryhan
最好使用@PrepareOnlyThisForTest而不是@PrepareForTest。后者还会修改超类,这通常是不必要的。 - Leo
但是当我添加一个特定的类时,我会收到**java.lang.Exception: No tests found matching [{ExactMatcher:fDisplayName=test], {ExactMatcher:fDisplayName=test(aero.tav.tams.task.manager.PMTest)], {LeadingIdentifierMatcher:fClassName=aero.tav.tams.task.manager.PMTest,fLeadingIdentifier=test]] from org.junit.internal.requests.ClassRequest@dc9876b at org.junit.internal.requests.FilterRequest.getRunner(FilterRequest.java:40)**。如果我删除这个类,它就可以工作了。 - ceyun

14
@Test
 @PrepareForTest({Class1.class, Class2.class})
 public final void handleScript() throws Exception {
    PowerMockito.mockStatic(Class1.class);
    PowerMockito.mockStatic(Class2.class);

请提供需要翻译的内容。

关于 PowerMock 1.6.5,在方法级别使用 @PrepareForTest 存在问题(对我来说只能在类级别上工作)。 - Nikita Barishok

4
如果您正在使用 Kotlin,语法如下:
``` @PrepareForTest(ClassA::class, ClassB::class) ```

2
在使用powermock/junit的Java中,可以使用@PrepareForTest({})标注,将需要模拟的静态类以数组形式({})传入。
@RunWith(PowerMockRunner.class)
@PrepareForTest({XmlConverterA.class, XmlConverterB.class})
class TransfersServiceExceptionSpec {

}

我曾在Scala/JUnit中使用PowerMock,因为ScalaTest与PowerMock不兼容。

@RunWith(classOf[PowerMockRunner])
@PrepareForTest(Array(classOf[XmlConverterA], classOf[XmlConverterB]))
class TransfersServiceExceptionSpec {

  @Test
  def test() {
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接