【问题标题】:java.lang.LinkageError: loader constraint violation When trying to use Mockito Argument Matcherjava.lang.LinkageError:加载程序约束冲突尝试使用 Mockito 参数匹配器时
【发布时间】:2015-05-02 15:00:43
【问题描述】:

我正在尝试测试一个类,并且我有自己的参数 Mathcher 来匹配这些参数。代码如下:

 @Test
public void testDoBindModelsToForm()
{
    OrganizationToRelatedSubregionsConverter organizationToRelatedSubregionsConverter = mock(OrganizationToRelatedSubregionsConverter.class);
    List<Organization> subregion1 = new ArrayList<Organization>();

    Organization subregionOrg1 = CommonentityFactory.eINSTANCE.createOrganization();
    subregionOrg1.setMID(OrganizationMID.create(DOMAIN, 100L));
    subregionOrg1.setNameFormatted("Subregion 1"); //$NON-NLS-1$
    subregion1.add(subregionOrg1);
    when(
            organizationToRelatedSubregionsConverter.convert(Matchers
                    .argThat(new OrganizationMIDMatcher(catchmentArea1.getMID())))).thenReturn(
            subregion1);

    CatchmentFormController catchmentFormController = new CatchmentFormController(
            catchmentForm, DOMAIN, conversationDescriptor, configuration, registrationManager,
            catchment, null, LaunchMode.ADD, organizationToRelatedSubregionsConverter);

    catchmentFormController.renderDynamicForm();
    organizationToRelatedSubregionsConverter.convert(catchmentArea1.getMID());
}

这是我的自定义 Matcher 类:

static class OrganizationMIDMatcher extends ArgumentMatcher<OrganizationMID>
{
    private OrganizationMID expectedOrganizationMID;

    public OrganizationMIDMatcher(OrganizationMID expectedOrganizationMID)
    {
        this.expectedOrganizationMID = expectedOrganizationMID;
    }

    @Override
    public boolean matches(Object argument)
    {
        if (argument != null && argument instanceof OrganizationMID)
        {
            OrganizationMID actualOrganization = (OrganizationMID) argument;
            return actualOrganization.equals(expectedOrganizationMID);
        }
        return false;
    }
}

当我运行测试时,我收到以下错误。我使用的 Mockito 依赖项是 Mockito-all 1.8.5。

  > java.lang.LinkageError: loader constraint violation:
 when resolving method "org.mockito.Matchers.argThat(Lorg/hamcrest/Matcher;)Ljava/lang/Object;" 
 the class loader (instance of org/eclipse/osgi/internal/baseadaptor/DefaultClassLoader)
 of the current class, com/cerner/registration/ui/internal/converters/OrganizationToRelatedSubregionsConverterTest,
 and the class loader
    (instance of org/eclipse/osgi/internal/baseadaptor/DefaultClassLoader) for resolved class,
 org/mockito/Matchers, have different Class objects for the type org/hamcrest/Matcher used in the signature

您知道这里可能存在什么问题吗?

【问题讨论】:

  • 包含 hamcrest 的 jar 在您的运行时环境中是唯一的吗? (旧的junit包含embedded,如果mockito依赖也被解决,这可能会导致问题。)
  • @GáborBakos 我正在使用 junit 4.8.2-v370 和 mockito-all 1.8.5。我看到在我的依赖树中,junit 引入了 hamcrest 1.1.0。我应该为 hamcrest 添加另一个依赖项吗?

标签: java mockito linkageerror


【解决方案1】:

您不应将mockito-alljunit 4.8.2-v370 一起使用。两者都包含 hamcrest 依赖项,并且由于它们在 OSGi 环境中使用不同的类加载器,因此这些类将不兼容。作为一种解决方法,您应该考虑使用mockito-core1.8.5,如果想使用相同的版本)和至少junit4.9 版本(他们开始正确捆绑hamcrest:作为依赖项)。

或者-不要遵循-您可以“分叉”junit4.8.2 版本,然后在没有hamcrest 类的情况下重新打包它。

【讨论】:

  • 我在我的 pom.xml 中为hamcrestobjenesis 添加了mockito-core v1.8.5 和osgi 包。我还将junit升级到4.11.0-SDK-4.3.1,现在它可以工作了。非常感谢。欣赏它:)
猜你喜欢
  • 1970-01-01
  • 2014-08-16
  • 1970-01-01
  • 1970-01-01
  • 2018-04-04
  • 1970-01-01
  • 1970-01-01
  • 2022-08-17
  • 2014-09-30
相关资源
最近更新 更多