import org.gradle.api.GradleException import org.gradle.api.file.ConfigurableFileCollection import org.gradle.api.provider.Property import org.gradle.api.tasks.Classpath import org.gradle.api.tasks.Input import org.gradle.api.tasks.testing.Test import org.gradle.process.CommandLineArgumentProvider abstract class MockitoAgentArgumentProvider implements CommandLineArgumentProvider { @Classpath abstract ConfigurableFileCollection getMockitoCoreClasspath() @Input abstract Property getOwner() @Override Iterable asArguments() { List candidates = mockitoCoreClasspath.files.findAll { File file -> file.isFile() && file.name ==~ 'mockito-core-[^/]+\\.jar' }.sort { File left, File right -> left.absolutePath <=> right.absolutePath } if (candidates.size() != 1) { throw new GradleException( "${owner.get()}: expected exactly one mockito-core JAR for the test JVM, " + "found ${candidates.size()}: " + candidates.collect { it.absolutePath }) } File mockitoCore = candidates[0] ["-javaagent:${mockitoCore.absolutePath}", '-Xshare:off'] } } rootProject.subprojects { Project target -> target.pluginManager.withPlugin('java') { target.pluginManager.withPlugin('io.spring.dependency-management') { def mockitoAgentDependencies = target.configurations.dependencyScope('mockitoAgentDependencies') def mockitoAgent = target.configurations.resolvable('mockitoAgent') { description = 'Mockito core JAR used only as a Test JVM startup agent.' extendsFrom(mockitoAgentDependencies.get()) transitive = false } target.dependencies.add( mockitoAgentDependencies.get().name, 'org.mockito:mockito-core') target.tasks.withType(Test).configureEach { def provider = target.objects.newInstance(MockitoAgentArgumentProvider) provider.mockitoCoreClasspath.from(mockitoAgent) provider.owner.set("${target.path}:${name}") jvmArgumentProviders.add(provider) } } } }