Java 17, Gradle 8.3 and Spring Boot 3.2.4 here. My build.gradle
looks like:
plugins {
id 'application'
id "io.freefair.lombok" version '6.4.0'
id 'org.springframework.boot' version '3.2.4'
id 'io.spring.dependency-management' version '1.1.4'
}
repositories {
mavenLocal()
mavenCentral()
}
dependencies {
implementation (
'org.apache.commons:commons-lang3:3.12.0'
,'commons-io:commons-io:2.11.0'
,'org.projectlombok:lombok:1.18.16'
,"org.springframework.boot:spring-boot-starter"
,"org.springframework.boot:spring-boot-starter-actuator"
,"org.springframework.boot:spring-boot-starter-web"
,"org.springframework.boot:spring-boot-starter-data-jpa"
,"org.springframework.boot:spring-boot-starter-data-rest"
,"org.springframework.boot:spring-boot-starter-jdbc"
,"org.springframework.boot:spring-boot-starter-validation"
,"org.springframework.boot:spring-boot-starter-logging"
,"org.springframework.boot:spring-boot-starter-thymeleaf"
,"org.springframework.boot:spring-boot-starter-security"
,"org.springframework.boot:spring-boot-starter-oauth2-client"
,"org.springframework.boot:spring-boot-starter-mail"
,'mysql:mysql-connector-java:8.0.30'
,'org.liquibase:liquibase-core:4.26.0'
,'org.slf4j:log4j-over-slf4j:1.7.33'
)
testImplementation (
'org.springframework.boot:spring-boot-starter-test'
,'org.springframework.security:spring-security-test'
'org.junit.jupiter:junit-jupiter-api:5.8.1'
,'org.springframework.boot:spring-boot-starter-test'
,'org.springframework.security:spring-security-test'
,'com.h2database:h2:2.1.214'
,'org.mockito:mockito-core'
)
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1'
}
tasks.named('test') {
useJUnitPlatform()
}
bootJar {
archiveFileName = "myapp.jar"
}
java {
sourceCompatibility = '17'
}
I have a base unit test class:
@SpringBootTest
public abstract class BaseUnitTest {
@BeforeEach
public abstract void setupForEach();
protected UserEntity createMockUser() {
return Mockito.mock(UserEntity.class);
}
protected OrgEntity createMockOrganization() {
return Mockito.mock(OrgEntity.class);
}
// other test helper methods
}
And a test class:
public class RegistrationServiceTest extends BaseUnitTest {
@MockBean
private UserService userService;
@MockBean
private OrgService orgService;
@Autowired
private RegistrationService registrationService;
@Override
public void setupForEach() {
}
@Test
public void inviteUser_whenInputIsGood_thenUserIsCreatedAndInviteIsSent() {
// setup
UserEntity newUser = createMockUser();
OrgEntity org = createMockOrganization();
when(userService.getByEmail(eq("some email"), anyBoolean())).thenReturn(null);
when(organizationService.getByRefId(anyString())).thenReturn(org);
// test
UserInvitationEntity result = registrationService.inviteUser(user);
// check
assertNotNull(result);
}
}
When I run this test class I get the following exception:
java.lang.NoSuchMethodError: 'org.junit.jupiter.api.extension.ExecutableInvoker org.junit.jupiter.api.extension.ExtensionContext.getExecutableInvoker()'
at org.springframework.test.context.junit.jupiter.SpringExtension.registerMethodInvoker(SpringExtension.java:381)
at org.springframework.test.context.junit.jupiter.SpringExtension.beforeAll(SpringExtension.java:132)
at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeBeforeAllCallbacks$10(ClassBasedTestDescriptor.java:381)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.invokeBeforeAllCallbacks(ClassBasedTestDescriptor.java:381)
at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.before(ClassBasedTestDescriptor.java:205)
at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.before(ClassBasedTestDescriptor.java:80)
<large stacktrack omitted for brevity>
Suppressed: java.lang.NoSuchMethodError: 'org.junit.jupiter.api.extension.ExecutableInvoker org.junit.jupiter.api.extension.ExtensionContext.getExecutableInvoker()'
at org.springframework.test.context.junit.jupiter.SpringExtension.registerMethodInvoker(SpringExtension.java:381)
at org.springframework.test.context.junit.jupiter.SpringExtension.afterAll(SpringExtension.java:143)
at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeAfterAllCallbacks$16(ClassBasedTestDescriptor.java:447)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeAfterAllCallbacks$17(ClassBasedTestDescriptor.java:447)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.invokeAfterAllCallbacks(ClassBasedTestDescriptor.java:447)
at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.after(ClassBasedTestDescriptor.java:229)
at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.after(ClassBasedTestDescriptor.java:80)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:161)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:161)
... 48 more
Don’t worry about the coding/implementation of my test class/method, I’m curious as to why I’m getting this java.lang.NoSuchMethodError
. I suspect its incompatible versions of Java, Spring Boot and JUnit but I can’t tell where I’m going wrong.