java.lang.LinkageError:接口itable初始化中的加载程序约束冲突:

java.lang.LinkageError:接口itable初始化中的加载程序约束冲突:,java,swing,mockito,powermock,powermockito,Java,Swing,Mockito,Powermock,Powermockito,当我试图模拟JTextField时,我遇到了这个错误 java.lang.LinkageError: loader constraint violation in interface itable initialization: when resolving method "javax.swing.text.JTextComponent$1.dropLocationForPoint( Ljavax/swing/text/JTextComponent;Ljava/awt/P

当我试图模拟
JTextField
时,我遇到了这个错误

java.lang.LinkageError: loader constraint violation in interface itable
    initialization: when resolving method
    "javax.swing.text.JTextComponent$1.dropLocationForPoint(
    Ljavax/swing/text/JTextComponent;Ljava/awt/Point;)Ljavax/
    swing/TransferHandler$DropLocation;" the class loader (instance of
    org/powermock/core/classloader/MockClassLoader) of the current
    class, javax/swing/text/JTextComponent$1, and the class loader
    (instance of <bootloader>) for interface
    sun/swing/SwingAccessor$JTextComponentAccessor have different Class
    objects for the type mponent$1.dropLocationForPoint(Ljavax/swing/text/
    JTextComponent;Ljava/awt/Point;)Ljavax/swing/TransferHandler$
    DropLocation; used in the signature
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:191)
at javassist.runtime.Desc.getClassObject(Desc.java:43)

没有任何效果。

基于的场景,我有一个解决方法:问题发生在
javax.swing.text.JTextComponent的静态初始值设定项中,因此我们可以使用
@SuppressStaticInitializationFor(“javax.swing.text.JTextComponent”)来抑制该代码。

下面是一个工作测试用例(使用Powermock 1.6.4):


你在嘲笑什么会抛出这个错误?假设您在添加此代码之前运行了powermockito,请尝试逐行注释新代码,直到您知道导致此问题的原因。尝试添加“java.swing.text.*”添加到忽略列表。这不起作用。模拟JTextArea导致了此问题。在包含@powerMockIgnore之前,您的错误消息是什么?只需创建一个只有一行的类,例如,JTextArea text=new JTextArea(5,5);然后写一个测试用例。你可以自己看。你也可以检查这个问题是由另一个提出的
@PowerMockIgnore( {"javax.management.*","javax.security.*","javax.ws.*"}) 
import static org.mockito.Mockito.when;
import static org.powermock.api.mockito.PowerMockito.mock;

import javax.swing.JOptionPane;
import javax.swing.JTextArea;

import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.core.classloader.annotations.SuppressStaticInitializationFor;
import org.powermock.modules.junit4.PowerMockRunner;

@RunWith(PowerMockRunner.class)
@PrepareForTest(JOptionPane.class)
@SuppressStaticInitializationFor("javax.swing.text.JTextComponent")
public class PowerMockIssue {
    @Test
    public void powermockTest() {
        final JTextArea textArea = mock(JTextArea.class);
        when(textArea.getText()).thenReturn("test");
        Assert.assertEquals("test", textArea.getText());
    }
}