【问题标题】:Powermockito java.lang.VerifyErrorPowermockito java.lang.VerifyError
【发布时间】:2018-09-22 05:25:33
【问题描述】:

我正在使用 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

【问题讨论】:

    标签: java exception powermock powermockito verifyerror


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      @PowerMockIgnore("javax.swing.*") 注释您的测试类,正如on GitHub 所评论的那样,有帮助吗?

      【讨论】:

      • 我也试过 -noverify 和 -XX:-UseSplitVerifier 但都没有帮助。如果我无能为力,我可能不得不重构类,这样我就不必使用 PowerMockito,但它的工作量太大,所以我想避免这样做。
      • 你能提供一个SSCE吗?这将有助于解决这个问题。
      • 其他然后我在我的例子中写的唯一我能说的是我使用@RunWith(PowerMockRunner.class) 和@PrepareForTest({AccessServiceUtil.class, RelatedIntelligencePanel.class}) 和我上面的代码staticMocked 类甚至没有使用 AccesServiceUtil。
      • 但我尝试在我的代码中添加更多细节。我希望它有所帮助。
      【解决方案3】:

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

      查看这个 sn-p (PowerMockito mock single static method and return object)

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

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

      【讨论】:

      • 因为我试图模拟一些新的创作,所以我必须使用 whenNew 和 noArgs。
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2011-05-05
        • 1970-01-01
        • 2016-08-05
        • 2010-10-14
        • 2023-04-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多