Kevin Nammour
Kevin Nammour

Reputation: 29

Writing tests for apache maven resolver

I have a class in my maven project that is used to resolve artifacts during a mojo execution. However I need to write tests for this ArtifactResolver class that tests it on a real repo which is let's say maven's central repo.

This is my class:

public class ArtifactResolver {
    private final RepositorySystem repositorySystem;

    private final RepositorySystemSession repositorySystemSession;

    private final List<RemoteRepository> remoteRepositoryList;

    public ArtifactResolver(RepositorySystem repositorySystem,
                            RepositorySystemSession repositorySystemSession,
                            List<RemoteRepository> remoteRepositoryList) {
        this.repositorySystem = repositorySystem;
        this.repositorySystemSession = repositorySystemSession;
        this.remoteRepositoryList = remoteRepositoryList;
    }

    public ArtifactResult resolve(Artifact artifact) throws ArtifactResolutionException {
        ArtifactRequest artifactRequest = new ArtifactRequest();
        artifactRequest.setArtifact(artifact);
        artifactRequest.setRepositories(remoteRepositoryList);
        return repositorySystem.resolveArtifact(repositorySystemSession, artifactRequest);
    }
}

I just want to create mock instances of repositorySystemSession and remoteRepositoryList that will be able to resolve a real dependency like log4j for example.

Adding the remote repositories works manually, however I am finding mocking instances of repositorySystemSession and remoteRepositoryList hard. What I tried is creating them using the following:

package murex.subsystems.dependencies.services;

import org.eclipse.aether.RepositorySystem;
import org.eclipse.aether.RepositorySystemSession;
import org.eclipse.aether.artifact.DefaultArtifact;
import org.eclipse.aether.repository.RemoteRepository;
import org.apache.maven.repository.internal.MavenRepositorySystemUtils;
import org.eclipse.aether.resolution.ArtifactResolutionException;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;

import java.io.File;
import java.util.Collections;
import java.util.List;

public class ArtifactResolverTest {
    private ArtifactResolver artifactResolver;

    @BeforeEach
    public void beforeEach(@TempDir File tempDir) {
        RepositorySystem repositorySystem = MavenRepositorySystemUtils.newServiceLocator().getService(RepositorySystem.class);
        RepositorySystemSession repositorySystemSession = MavenRepositorySystemUtils.newSession();
        RemoteRepository remoteRepository = new RemoteRepository.Builder("central", "default", "https://repo.maven.apache.org/maven2/").build();
        List<RemoteRepository> remoteRepositoryList = Collections.singletonList(remoteRepository);
        artifactResolver = new ArtifactResolver(null, repositorySystem, repositorySystemSession, remoteRepositoryList);

    }

    @Test
    void testResolve() throws ArtifactResolutionException {
        artifactResolver.resolve(new DefaultArtifact("log4j:log4j:1.2.17"));
    }
}

But I am facing the following error:

java.lang.NullPointerException: repository system session's local repository manager cannot be null

So can anyone assist me with that?

Upvotes: 1

Views: 81

Answers (0)

Related Questions