Powermockito java.lang.VerifyError

Powermockito java.lang.VerifyError

我正在使用 powermock.mockstatic 这条线,这样我就可以控制它的返回值,因为它唯一的摆动我不需要测试它。

@Before
public void setUp() throws Exception
RelatedIntelligencePanel  rel = Mockito.mock(RelatedIntelligencePanel.class);
PowerMockito.mockStatic(RelatedIntelligencePanel.class);
PowerMockito.whenNew(RelatedIntelligencePanel.class).withNoArguments().thenReturn(rel);
...
.. some other unrelated code
}
...........
........ some other code and Tests
......
@Test
public class SomeClass{
RelatedIntelligencePanel relIntPanel = new RelatedIntelligencePanel();

但它抛出 java.lang.VerifyError。我对这种事情做了很多嘲笑,这样的事情也不例外。删除 @PrepareForTest 和 @Runwith 会有所帮助,但是当我这样做时我会失去 powermock。我的详细错误也在下面;

java.lang.VerifyError: Bad return type
Exception Details:
Location:
javax/swing/plaf/metal/MetalLookAndFeel.getLayoutStyle()Ljavax/swing/LayoutStyle @3: areturn
Reason:
Type 'javax/swing/plaf/metal/MetalLookAndFeel$MetalLayoutStyle' (current frame, stack[0]) is not assignable to 'javax/swing/LayoutStyle' (from method signature)
Current Frame:
bci: @3
flags: { }
locals: { 'javax/swing/plaf/metal/MetalLookAndFeel'}
stack {'javax/swing/plaf/metal/MetalLookAndFeel$MetalLayoutStyle'}
Bytecode:
0x0000000: b807 49b0

seems to be a problem Powermock、@PrepareForTest 和静态方法。

如评论 on GitHub 所述,使用 @PowerMockIgnore("javax.swing.*") 注释您的测试 class 是否有帮助?

这不是使用 PowerMockito 模拟静态的方式。

查看此片段 (PowerMockito mock single static method and return object)

PowerMockito.mockStatic(ClassWithStatics.class);
when(ClassWithStatics.getString()).thenReturn("Hello!");

因为你想模拟静态方法,你不应该使用 whenNew 构造,可能会导致你的错误。

好的,我找到了答案。同时使用 @PowerMockIgnore("javax.swing.*")

PowerMockito.mockStatic(ClassWithStatics.class);
when(ClassWithStatics.getString()).thenReturn("Hello!");

确实解决了我的问题。如果没有 @PowerMockIgnore("javax.swing.*")PowerMockito.when 将无法工作,反之亦然。 @stuXnet 和@staszko032 都是正确的,但这些建议并不能单独发挥作用。注意:WhenNew 也有效,但在这种情况下无效。

我遇到了一个稍微不同的问题。我看到在 javax.net.* 中抱怨 class 的错误,所以我将 javax.net.* 添加到 @PowerMockIgnore(...),它为我解决了这个问题。似乎您可以简单地忽略问题包,这将解决您的问题。