Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to make JUnit4 + Hamcrest 1.3 + Mockito work from Eclipse AND Tycho

I've managed to get JUnit 4.12 + Hamcrest 1.3 + Mockito 2.8.47 to work in Eclipse so that when I add them as dependencies, my tests will run.

(The way I've done this is using the p2-maven-plugin to bundle the following artifacts from Maven Central into plugins/a feature and provide them via P2:

  • junit 4.12
  • org.mockito.mockito-core 2.8.47
  • org.hamcrest.all 1.3.0

Adding the plugins to my test fragment as dependencies makes the tests run in Eclipse.

However, the Tycho build of the same fragment will fail with the following messages:

java.lang.LinkageError: loader constraint violation: loader (instance of org/eclipse/osgi/internal/loader/EquinoxClassLoader) previously initiated loading for a different type with name "org/hamcrest/Matcher" 
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
at org.eclipse.osgi.internal.loader.ModuleClassLoader.defineClass(ModuleClassLoader.java:273)
at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.defineClass(ClasspathManager.java:632)
at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findClassImpl(ClasspathManager.java:586)
at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClassImpl(ClasspathManager.java:538)
at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClass(ClasspathManager.java:525)
at org.eclipse.osgi.internal.loader.ModuleClassLoader.findLocalClass(ModuleClassLoader.java:325)
at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:345)
at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:423)
at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:372)
at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:364)
at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:161)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:12)
at org.junit.Assert.assertThat(Assert.java:956)
at org.junit.Assert.assertThat(Assert.java:923)

So it seems that some other plugin is loading the package org.hamcrest.Matcher before my fragment does. This is probably due to the import/export/partial import/partial export chaos surrounding the JUnit/Hamcrest/Mockito setup.

Does anyone have an idea -- or even better: a working example -- of how to get the three components work together both within the IDE (for quick checks on whether tests run) and Tycho (for checks during the build)?

like image 930
s.d Avatar asked Jul 20 '17 15:07

s.d


People also ask

How do I add Hamcrest to eclipse?

Right click on your eclipse project and select 'Properties' and then select 'Java Build Path' in the left pane and 'Libraries' on the right. On the 'Libraries' tab click the 'Add External Jars' button and navigate to the hamcrest-all jar you previously downloaded.

Does JUnit include Hamcrest?

1. Overview. Hamcrest is the well-known framework used for unit testing in the Java ecosystem. It's bundled in JUnit and simply put, it uses existing predicates – called matcher classes – for making assertions.

What is Hamcrest matcher?

Hamcrest is a framework that assists writing software tests in the Java programming language. It supports creating customized assertion matchers ('Hamcrest' is an anagram of 'matchers'), allowing match rules to be defined declaratively. These matchers have uses in unit testing frameworks such as JUnit and jMock.


1 Answers

Seems like that the loader want the dependencies in a bundle.

But I guess you haven't put your test lib in a bundle.

You could try to add them in the dependencies of your product to see how it reacts.

like image 186
Xavier Bouclet Avatar answered Oct 11 '22 21:10

Xavier Bouclet