Spring Boot with GraphQL - schema issue - java

I am playing around with GraphQL and Spring Boot, but I am stuck on this issue for a while now.
First, here is my build.gradle:
...
compile 'com.graphql-java-kickstart:graphql-spring-boot-starter:5.10.0'
compile group: 'com.graphql-java', name: 'graphql-java-tools', version: '5.2.4'
runtime 'com.graphql-java-kickstart:graphiql-spring-boot-starter:5.10.0'
...
I have an entity, lets say - Dog, a Repository, Service, Mutator and a Query for it. In /resources I have dogs.graphqls with the schema in there.
But for some reason, I cannot get the app to start. The error message reads: No graphql schema files found on classpath with location pattern '**/*.graphqls'. When i remove the dependency to com.graphql-java-kickstart:graphql-spring-boot-starter it starts, but does not find the schema.
Any ideas?

Include the following code in pom.xml:
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.graphqls</include>
</includes>
</resource>

I have a GraphQL spring-boot project and I see 2 differences:
my schemas are in resources/graphql - probably doesn't matter
some other dependencies - I remember playing with those dependencies to fix similar problems to this
Have a look - https://github.com/xShadov/code-hellven/blob/master/core/api/pom.xml - try using similar dependencies (not sure how it translates to gradle):
<graphql.version>5.4.1</graphql.version>
<graphql-datetime-spring-boot-starter.version>1.4.0</graphql-datetime-spring-boot-starter.version>
<dependency>
<groupId>com.graphql-java-kickstart</groupId>
<artifactId>graphql-spring-boot-starter</artifactId>
<version>${graphql.version}</version>
</dependency>
<dependency>
<groupId>com.graphql-java-kickstart</groupId>
<artifactId>graphiql-spring-boot-starter</artifactId>
<version>${graphql.version}</version>
</dependency>
<dependency>
<groupId>com.graphql-java-kickstart</groupId>
<artifactId>voyager-spring-boot-starter</artifactId>
<version>${graphql.version}</version>
</dependency>
<dependency>
<groupId>com.graphql-java-kickstart</groupId>
<artifactId>graphql-java-tools</artifactId>
<version>${graphql.version}</version>
</dependency>
<dependency>
<groupId>com.zhokhov.graphql</groupId>
<artifactId>graphql-datetime-spring-boot-starter</artifactId>
<version>${graphql-datetime-spring-boot-starter.version}</version>
</dependency>

I changed out the kickstarter dependencies with these:
compile group: 'com.graphql-java', name: 'graphql-spring-boot-starter', version: '5.0.2'
compile group: 'com.graphql-java', name: 'graphql-java-tools', version: '5.2.4'
compile group: 'com.graphql-java', name: 'graphiql-spring-boot-starter', version: '3.0.3'
:|

Related

SecurityException for class org.bouncycastle.jcajce.provider.asymmetric.DSTU4145$Mappings

I am using Spring boot version 2.1.11.After adding the spring-security-oauth2-autoconfigure in my pom.xml.I am getting the following error while running the application.
"java.lang.SecurityException: class "org.bouncycastle.jcajce.provider.asymmetric.DSTU4145$Mappings"'s signer information does not match signer information of other classes in the same package"
It is because of some jar version incompatibility in the libraries to load, aka. jar-hell.
Try to exclude the group org.bouncycastle. You can specify the version also: bcprov-jdk16
For gradle:
implementation(group: 'aaa', name: 'bbb', version: '1.0.0') {
exclude group: 'org.bouncycastle'
}
For maven:
<dependency>
<groupId>aaa</groupId>
<artifactId>bbb</artifactId>
<version>1.0.0</version>
<exclusions>
<exclusion>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk16</artifactId>
</exclusion>
</exclusions>
</dependency>

Mockito making valid Junit tests fail [duplicate]

I'm using JUnit-dep 4.10 and Hamcrest 1.3.RC2.
I've created a custom matcher that looks like the following:
public static class MyMatcher extends TypeSafeMatcher<String> {
#Override
protected boolean matchesSafely(String s) {
/* implementation */
}
#Override
public void describeTo(Description description) {
/* implementation */
}
#Override
protected void describeMismatchSafely(String item, Description mismatchDescription) {
/* implementation */
}
}
It works perfectly fine when run from the command line using Ant. But when run from IntelliJ, it fails with:
java.lang.NoSuchMethodError: org.hamcrest.Matcher.describeMismatch(Ljava/lang/Object;Lorg/hamcrest/Description;)V
at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:18)
at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:8)
at com.netflix.build.MyTest.testmyStuff(MyTest.java:40)
My guess is that it's using the wrong hamcrest.MatcherAssert. How do I find which hamcrest.MatcherAssert it's using (ie which jar file it's using for hamcrest.MatcherAssert)? AFAICT, the only hamcrest jars in my classpath is 1.3.RC2.
Is IntelliJ IDEA using it's own copy of JUnit or Hamcrest?
How do I output the runtime CLASSPATH that IntelliJ is using?
Make sure the hamcrest jar is higher on the import order than your JUnit jar.
JUnit comes with its own org.hamcrest.Matcher class that is probably being used instead.
You can also download and use the junit-dep-4.10.jar instead which is JUnit without the hamcrest classes.
mockito also has the hamcrest classes in it as well, so you may need to move\reorder it as well
This problem also arises when you have mockito-all on your class path, which is already deprecated.
If possible just include mockito-core.
Maven config for mixing junit, mockito and hamcrest:
<dependencies>
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-core</artifactId>
<version>1.3</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-library</artifactId>
<version>1.3</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<version>1.9.5</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
The problem was that the wrong hamcrest.Matcher, not hamcrest.MatcherAssert, class was being used. That was being pulled in from a junit-4.8 dependency one of my dependencies was specifying.
To see what dependencies (and versions) are included from what source while testing, run:
mvn dependency:tree -Dscope=test
The following should be the most correct today. Note, junit 4.11 depends on hamcrest-core, so you shouldn't need to specify that at all, mockito-all cannot be used since it includes (not depends on) hamcrest 1.1
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>1.10.8</version>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-core</artifactId>
</exclusion>
</exclusions>
</dependency>
This worked for me after struggling a bit
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-all</artifactId>
<version>1.3</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<version>1.9.5</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
I know this is an old thread but what solved the issue for me was adding the following to my build.gradle files.
As already stated above there is a compatibility issue with mockito-all
Possibly useful post:
testCompile ('junit:junit:4.12') {
exclude group: 'org.hamcrest'
}
testCompile ('org.mockito:mockito-core:1.10.19') {
exclude group: 'org.hamcrest'
}
testCompile 'org.hamcrest:hamcrest-core:1.3'
Try
expect(new ThrowableMessageMatcher(new StringContains(message)))
instead of
expectMessage(message)
You may write a custom ExpectedException or utility method to wrap up the code.
As of July, 2020 the following dependencies in pom.xml worked for me:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
</dependency>
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest</artifactId>
<version>2.1</version>
</dependency>
With this 4.13 junit library and hamcrest, it uses hamcrest.MatcherAssert when asserting and throws exception-
enter image description here
Despite the fact that this is a very old question
and probably many of the beforementioned ideas solved many problems,
I still want to share the solution with the community that fixed my problem.
I found that the problem was a function called "hasItem"
which I was using to check whether or not a JSON-Array contains a specific item.
In my case I checked for a value of type Long.
And this led to the problem.
Somehow, the Matchers have problems with values of type Long.
(I do not use JUnit or Rest-Assured so much so idk. exactly why,
but I guess that the returned JSON-data does just contain Integers.)
So what I did to actually fix the problem was the following.
Instead of using:
long ID = ...;
...
.then().assertThat()
.body("myArray", hasItem(ID));
you just have to cast to Integer.
So the working code looked like this:
long ID = ...;
...
.then().assertThat()
.body("myArray", hasItem((int) ID));
That's probably not the best solution,
but I just wanted to mention that the exception can also be thrown because of wrong/unknown data types.
I have a gradle project and when my build.gradle dependencies section looks like this:
dependencies {
implementation group: 'org.apache.commons', name: 'commons-lang3', version: '3.8.1'
testImplementation group: 'org.mockito', name: 'mockito-all', version: '1.10.19'
testImplementation 'junit:junit:4.12'
// testCompile group: 'org.mockito', name: 'mockito-core', version: '2.23.4'
compileOnly 'org.projectlombok:lombok:1.18.4'
apt 'org.projectlombok:lombok:1.18.4'
}
it leads to this exception:
java.lang.NoSuchMethodError: org.hamcrest.Matcher.describeMismatch(Ljava/lang/Object;Lorg/hamcrest/Description;)V
at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:18)
at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:8)
to fix this issue, I've substituted "mockito-all" with "mockito-core".
dependencies {
implementation group: 'org.apache.commons', name: 'commons-lang3', version: '3.8.1'
// testImplementation group: 'org.mockito', name: 'mockito-all', version: '1.10.19'
testImplementation 'junit:junit:4.12'
testCompile group: 'org.mockito', name: 'mockito-core', version: '2.23.4'
compileOnly 'org.projectlombok:lombok:1.18.4'
apt 'org.projectlombok:lombok:1.18.4'
}
The explanation between mockito-all and mockito-core can be found here:
https://solidsoft.wordpress.com/2012/09/11/beyond-the-mockito-refcard-part-3-mockito-core-vs-mockito-all-in-mavengradle-based-projects/
mockito-all.jar besides Mockito itself contains also (as of 1.9.5) two
dependencies: Hamcrest and Objenesis (let’s omit repackaged ASM and
CGLIB for a moment). The reason was to have everything what is needed
inside an one JAR to just put it on a classpath. It can look strange,
but please remember than Mockito development started in times when
pure Ant (without dependency management) was the most popular build
system for Java projects and the all external JARs required by a
project (i.e. our project’s dependencies and their dependencies) had
to be downloaded manually and specified in a build script.
On the other hand mockito-core.jar is just Mockito classes (also with
repackaged ASM and CGLIB). When using it with Maven or Gradle required
dependencies (Hamcrest and Objenesis) are managed by those tools
(downloaded automatically and put on a test classpath). It allows to
override used versions (for example if our projects uses never, but
backward compatible version), but what is more important those
dependencies are not hidden inside mockito-all.jar what allows to
detected possible version incompatibility with dependency analyze
tools. This is much better solution when dependency managed tool is
used in a project.
In my case, I had to exclude an older hamcrest from junit-vintage:
<dependency>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest</artifactId>
<version>2.1</version>
<scope>test</scope>
</dependency>
This worked for me. No need to exclude anything. I just used mockito-core instead mockito-all
testCompile 'junit:junit:4.12'
testCompile group: 'org.mockito', name: 'mockito-core', version: '3.0.0'
testCompile group: 'org.hamcrest', name: 'hamcrest-library', version: '2.1'
What worked for me was excluding the hamcrest group from the junit test compile.
Here is the code from my build.gradle:
testCompile ('junit:junit:4.11') {
exclude group: 'org.hamcrest'
}
If you're running IntelliJ you may need to run gradle cleanIdea idea clean build to detect the dependencies again.
I know that's not the best answer, but if you can't get the classpath working, this is a plan B solution.
In my test classpath, I added the following interface with a default implementation for the describeMismatch method.
package org.hamcrest;
/**
* PATCH because there's something wrong with the classpath. Hamcrest should be higher than Mockito so that the BaseMatcher
* implements the describeMismatch method, but it doesn't work for me.
*/
public interface Matcher<T> extends SelfDescribing {
boolean matches(Object item);
default void describeMismatch(Object item, Description mismatchDescription) {
mismatchDescription.appendDescriptionOf(this).appendValue(item);
}
#Deprecated
void _dont_implement_Matcher___instead_extend_BaseMatcher_();
}
For jUnit 4.12, the following dependency combination fixed my issue.
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-core</artifactId>
<version>1.3</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-library</artifactId>
<version>1.3</version>
<scope>test</scope>
</dependency>

Gradle + bintray: Specifying Dependencies of dependencies correctly

I have the following scenario:
I want to use a project of mine (hosted on bintray.com) in another project of mine.
I set up a maven repository, uploaded artifacts and pom files and then was able to utilize the jar file(s) uploaded to the bintray maven repo just fine, with the following build.gradle file:
apply plugin: 'java'
apply plugin: 'application'
mainClassName = 'randers.test.usageTest.UsageTest'
repositories {
maven { url 'http://dl.bintray.com/randers00/NotEnoughVocab' }
jcenter()
}
dependencies {
compile(group: 'randers.notenoughvocab.core', name: 'notenoughvocab-core', version: '0.0.1', ext: 'jar')
}
jar {
manifest {
attributes "Main-Class": mainClassName
}
}
This build file successfully equips the project with my core library and even makes sources, etc. available in the IDE (IntelliJ IDEA I use)
The problem is: The core itself uses libraries, which are not gotten by gradle.
This is the pom file that is on bintray:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>randers.notenoughvocab.core</groupId>
<artifactId>notenoughvocab-core</artifactId>
<version>0.0.1</version>
<dependencies>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.1.3</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.7</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.jdom</groupId>
<artifactId>jdom2</artifactId>
<version>2.0.6</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>commons-configuration</groupId>
<artifactId>commons-configuration</artifactId>
<version>1.10</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2.1</version>
<scope>compile</scope>
</dependency>
</dependencies>
<licenses>
<license>
<name>GNU General Public License, Version 3.0</name>
<url>http://www.gnu.org/licenses/gpl.txt</url>
<distribution>repo</distribution>
</license>
</licenses>
<contributors>
<contributor>
<name>Ruben Anders</name>
<email>RAnders00#users.noreply.github.com</email>
<url>https://github.com/RAnders00</url>
</contributor>
</contributors>
</project>
I looked at other projects on bintray and their pom files look similar.
Declaring the dependecy the traditional and simple way works fine:
compile 'randers.notenoughvocab.core:notenoughvocab-core:0.0.1'
It doesn't work when you specify ext: 'jar', because that is used to download a single artifact. From the user guide:
Artifact only notation
As said above, if no module descriptor file can be found, Gradle by default downloads a jar with the name of the module. But sometimes, even if the repository contains module descriptors, you want to download only the artifact jar, without the dependencies. [14] And sometimes you want to download a zip from a repository, that does not have module descriptors. Gradle provides an artifact only notation for those use cases - simply prefix the extension that you want to be downloaded with '#' sign:
Example 50.5. Artifact only notation
build.gradle
dependencies {
runtime "org.groovy:groovy:2.2.0#jar"
runtime group: 'org.groovy', name: 'groovy', version: '2.2.0', ext: 'jar'
}

java.lang.NoSuchMethodError: org.hamcrest.Matcher.describeMismatch [duplicate]

I'm using JUnit-dep 4.10 and Hamcrest 1.3.RC2.
I've created a custom matcher that looks like the following:
public static class MyMatcher extends TypeSafeMatcher<String> {
#Override
protected boolean matchesSafely(String s) {
/* implementation */
}
#Override
public void describeTo(Description description) {
/* implementation */
}
#Override
protected void describeMismatchSafely(String item, Description mismatchDescription) {
/* implementation */
}
}
It works perfectly fine when run from the command line using Ant. But when run from IntelliJ, it fails with:
java.lang.NoSuchMethodError: org.hamcrest.Matcher.describeMismatch(Ljava/lang/Object;Lorg/hamcrest/Description;)V
at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:18)
at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:8)
at com.netflix.build.MyTest.testmyStuff(MyTest.java:40)
My guess is that it's using the wrong hamcrest.MatcherAssert. How do I find which hamcrest.MatcherAssert it's using (ie which jar file it's using for hamcrest.MatcherAssert)? AFAICT, the only hamcrest jars in my classpath is 1.3.RC2.
Is IntelliJ IDEA using it's own copy of JUnit or Hamcrest?
How do I output the runtime CLASSPATH that IntelliJ is using?
Make sure the hamcrest jar is higher on the import order than your JUnit jar.
JUnit comes with its own org.hamcrest.Matcher class that is probably being used instead.
You can also download and use the junit-dep-4.10.jar instead which is JUnit without the hamcrest classes.
mockito also has the hamcrest classes in it as well, so you may need to move\reorder it as well
This problem also arises when you have mockito-all on your class path, which is already deprecated.
If possible just include mockito-core.
Maven config for mixing junit, mockito and hamcrest:
<dependencies>
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-core</artifactId>
<version>1.3</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-library</artifactId>
<version>1.3</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<version>1.9.5</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
The problem was that the wrong hamcrest.Matcher, not hamcrest.MatcherAssert, class was being used. That was being pulled in from a junit-4.8 dependency one of my dependencies was specifying.
To see what dependencies (and versions) are included from what source while testing, run:
mvn dependency:tree -Dscope=test
The following should be the most correct today. Note, junit 4.11 depends on hamcrest-core, so you shouldn't need to specify that at all, mockito-all cannot be used since it includes (not depends on) hamcrest 1.1
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>1.10.8</version>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-core</artifactId>
</exclusion>
</exclusions>
</dependency>
This worked for me after struggling a bit
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-all</artifactId>
<version>1.3</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<version>1.9.5</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
I know this is an old thread but what solved the issue for me was adding the following to my build.gradle files.
As already stated above there is a compatibility issue with mockito-all
Possibly useful post:
testCompile ('junit:junit:4.12') {
exclude group: 'org.hamcrest'
}
testCompile ('org.mockito:mockito-core:1.10.19') {
exclude group: 'org.hamcrest'
}
testCompile 'org.hamcrest:hamcrest-core:1.3'
Try
expect(new ThrowableMessageMatcher(new StringContains(message)))
instead of
expectMessage(message)
You may write a custom ExpectedException or utility method to wrap up the code.
As of July, 2020 the following dependencies in pom.xml worked for me:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
</dependency>
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest</artifactId>
<version>2.1</version>
</dependency>
With this 4.13 junit library and hamcrest, it uses hamcrest.MatcherAssert when asserting and throws exception-
enter image description here
Despite the fact that this is a very old question
and probably many of the beforementioned ideas solved many problems,
I still want to share the solution with the community that fixed my problem.
I found that the problem was a function called "hasItem"
which I was using to check whether or not a JSON-Array contains a specific item.
In my case I checked for a value of type Long.
And this led to the problem.
Somehow, the Matchers have problems with values of type Long.
(I do not use JUnit or Rest-Assured so much so idk. exactly why,
but I guess that the returned JSON-data does just contain Integers.)
So what I did to actually fix the problem was the following.
Instead of using:
long ID = ...;
...
.then().assertThat()
.body("myArray", hasItem(ID));
you just have to cast to Integer.
So the working code looked like this:
long ID = ...;
...
.then().assertThat()
.body("myArray", hasItem((int) ID));
That's probably not the best solution,
but I just wanted to mention that the exception can also be thrown because of wrong/unknown data types.
I have a gradle project and when my build.gradle dependencies section looks like this:
dependencies {
implementation group: 'org.apache.commons', name: 'commons-lang3', version: '3.8.1'
testImplementation group: 'org.mockito', name: 'mockito-all', version: '1.10.19'
testImplementation 'junit:junit:4.12'
// testCompile group: 'org.mockito', name: 'mockito-core', version: '2.23.4'
compileOnly 'org.projectlombok:lombok:1.18.4'
apt 'org.projectlombok:lombok:1.18.4'
}
it leads to this exception:
java.lang.NoSuchMethodError: org.hamcrest.Matcher.describeMismatch(Ljava/lang/Object;Lorg/hamcrest/Description;)V
at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:18)
at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:8)
to fix this issue, I've substituted "mockito-all" with "mockito-core".
dependencies {
implementation group: 'org.apache.commons', name: 'commons-lang3', version: '3.8.1'
// testImplementation group: 'org.mockito', name: 'mockito-all', version: '1.10.19'
testImplementation 'junit:junit:4.12'
testCompile group: 'org.mockito', name: 'mockito-core', version: '2.23.4'
compileOnly 'org.projectlombok:lombok:1.18.4'
apt 'org.projectlombok:lombok:1.18.4'
}
The explanation between mockito-all and mockito-core can be found here:
https://solidsoft.wordpress.com/2012/09/11/beyond-the-mockito-refcard-part-3-mockito-core-vs-mockito-all-in-mavengradle-based-projects/
mockito-all.jar besides Mockito itself contains also (as of 1.9.5) two
dependencies: Hamcrest and Objenesis (let’s omit repackaged ASM and
CGLIB for a moment). The reason was to have everything what is needed
inside an one JAR to just put it on a classpath. It can look strange,
but please remember than Mockito development started in times when
pure Ant (without dependency management) was the most popular build
system for Java projects and the all external JARs required by a
project (i.e. our project’s dependencies and their dependencies) had
to be downloaded manually and specified in a build script.
On the other hand mockito-core.jar is just Mockito classes (also with
repackaged ASM and CGLIB). When using it with Maven or Gradle required
dependencies (Hamcrest and Objenesis) are managed by those tools
(downloaded automatically and put on a test classpath). It allows to
override used versions (for example if our projects uses never, but
backward compatible version), but what is more important those
dependencies are not hidden inside mockito-all.jar what allows to
detected possible version incompatibility with dependency analyze
tools. This is much better solution when dependency managed tool is
used in a project.
In my case, I had to exclude an older hamcrest from junit-vintage:
<dependency>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest</artifactId>
<version>2.1</version>
<scope>test</scope>
</dependency>
This worked for me. No need to exclude anything. I just used mockito-core instead mockito-all
testCompile 'junit:junit:4.12'
testCompile group: 'org.mockito', name: 'mockito-core', version: '3.0.0'
testCompile group: 'org.hamcrest', name: 'hamcrest-library', version: '2.1'
What worked for me was excluding the hamcrest group from the junit test compile.
Here is the code from my build.gradle:
testCompile ('junit:junit:4.11') {
exclude group: 'org.hamcrest'
}
If you're running IntelliJ you may need to run gradle cleanIdea idea clean build to detect the dependencies again.
I know that's not the best answer, but if you can't get the classpath working, this is a plan B solution.
In my test classpath, I added the following interface with a default implementation for the describeMismatch method.
package org.hamcrest;
/**
* PATCH because there's something wrong with the classpath. Hamcrest should be higher than Mockito so that the BaseMatcher
* implements the describeMismatch method, but it doesn't work for me.
*/
public interface Matcher<T> extends SelfDescribing {
boolean matches(Object item);
default void describeMismatch(Object item, Description mismatchDescription) {
mismatchDescription.appendDescriptionOf(this).appendValue(item);
}
#Deprecated
void _dont_implement_Matcher___instead_extend_BaseMatcher_();
}
For jUnit 4.12, the following dependency combination fixed my issue.
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-core</artifactId>
<version>1.3</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-library</artifactId>
<version>1.3</version>
<scope>test</scope>
</dependency>

Neo4j 2.1.3 missing neo4j-kernal test-jar

I just tried upgrading to 2.1.3 and found the the following test-jar is missing from Maven Central:
<dependency>
<groupId>org.neo4j</groupId>
<artifactId>neo4j-kernel</artifactId>
<version>2.1.3</version>
<type>test-jar</type>
<scope>test</scope>
</dependency>
I am looking to use the TestGraphDatabaseFactory, any chance it moved?
It is there, see http://repo1.maven.org/maven2/org/neo4j/neo4j-kernel/2.1.3/ having a neo4j-kernel-2.1.3-tests.jar.
I've just verified that the equivalent dependency in gradle just works fine:
testCompile group: 'org.neo4j', name: 'neo4j-kernel', version: '2.1.3', classifier: 'tests'
Maybe you're using Maven central behind a proxy that has not yet been updated?

Categories