Skip to content

Commit

Permalink
Use Mockito to simplify mocking (#151)
Browse files Browse the repository at this point in the history
  • Loading branch information
HannesWell committed May 13, 2022
1 parent f142fe2 commit 7fd1fc3
Show file tree
Hide file tree
Showing 6 changed files with 72 additions and 491 deletions.
1 change: 1 addition & 0 deletions org.eclipse.m2e.tests/META-INF/MANIFEST.MF
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ Import-Package: org.eclipse.equinox.p2.metadata,
org.eclipse.ui.part,
org.eclipse.ui.views.markers,
org.mockito;version="[4.1.0,5.0.0)",
org.mockito.invocation;version="[4.1.0,5.0.0)",
org.mockito.stubbing;version="[4.1.0,5.0.0)",
org.slf4j
Automatic-Module-Name: org.eclipse.m2e.tests
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,10 @@
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;

import org.codehaus.plexus.classworlds.realm.ClassRealm;

Expand All @@ -44,81 +45,42 @@ public void setUp() throws Exception {
ClassRealmManagerDelegate.class, EclipseClassRealmManagerDelegate.ROLE_HINT);
}

@Test
public void testRealmSetup() throws Exception {
DummyRealm realm = new DummyRealm();

final List<ClassRealmConstituent> constituents = new ArrayList<>();

ClassRealmRequest request = new ClassRealmRequest() {

@Override
public List<ClassRealmConstituent> getConstituents() {
return constituents;
}

@Deprecated
@Override
public List<String> getImports() {
return new ArrayList<>();
}

List<String> realmImports = new ArrayList<>();
ClassRealm realm = new ClassRealm(null, "test-" + System.currentTimeMillis(), null) {
@Override
public ClassLoader getParent() {
return null;
public void importFrom(ClassLoader classLoader, String packageName) {
realmImports.add(packageName);
}

@Override
public RealmType getType() {
return RealmType.Plugin;
}

@Override
public Map<String, ClassLoader> getForeignImports() {
return null;
}

@Override
public List<String> getParentImports() {
return null;
}

};

List<ClassRealmConstituent> constituents = new ArrayList<>();
ClassRealmRequest request = Mockito.mock(ClassRealmRequest.class);
Mockito.when(request.getConstituents()).thenReturn(constituents);

delegate.setupRealm(realm, request);

assertFalse(realm.imports.toString(), realm.imports.contains("org.sonatype.plexus.build.incremental"));
assertFalse(realmImports.toString(), realmImports.contains("org.sonatype.plexus.build.incremental"));

constituents.add(new DummyConstituent("0.0.3"));

delegate.setupRealm(realm, request);

assertTrue(realm.imports.toString(), realm.imports.contains("org.sonatype.plexus.build.incremental"));
assertTrue(realmImports.toString(), realmImports.contains("org.sonatype.plexus.build.incremental"));

realm.imports.clear();
realmImports.clear();
constituents.clear();
constituents.add(new DummyConstituent("999.0"));

delegate.setupRealm(realm, request);

assertFalse(realm.imports.toString(), realm.imports.contains("org.sonatype.plexus.build.incremental"));
assertFalse(realmImports.toString(), realmImports.contains("org.sonatype.plexus.build.incremental"));
}

static class DummyRealm extends ClassRealm {

public List<String> imports = new ArrayList<>();

public DummyRealm() {
super(null, "test-" + System.currentTimeMillis(), null);
}

@Override
public void importFrom(ClassLoader classLoader, String packageName) {
imports.add(packageName);
}

}

static class DummyConstituent implements ClassRealmConstituent {
private static class DummyConstituent implements ClassRealmConstituent {

private String version;

Expand Down Expand Up @@ -155,7 +117,5 @@ public String getVersion() {
public File getFile() {
return new File("");
}

}

}
Original file line number Diff line number Diff line change
Expand Up @@ -15,21 +15,32 @@

import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

import java.io.File;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.mockito.stubbing.Answer;

import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationType;
import org.eclipse.debug.core.Launch;
import org.eclipse.jdt.launching.IVMRunner;

Expand All @@ -40,7 +51,6 @@
import org.eclipse.m2e.internal.launch.MavenLaunchUtils;
import org.eclipse.m2e.internal.launch.MavenRuntimeLaunchSupport.VMArguments;
import org.eclipse.m2e.internal.launch.MavenSourceLocator;
import org.eclipse.m2e.tests.mocks.MockLaunchConfiguration;
import org.eclipse.m2e.tests.mocks.MockVMRunner;


Expand Down Expand Up @@ -103,8 +113,8 @@ public void testGetVMArgumentsSubstituteMultiModuleDir() throws Exception {
if(!Files.exists(mvn)) {
Files.createDirectories(mvn);
}
ILaunchConfiguration configuration = new MockLaunchConfiguration(
Map.of(MavenLaunchConstants.ATTR_POM_DIR, "${workspace_loc}/foo/bar"));
ILaunchConfiguration configuration = mockLaunchConfiguration(
Map.of(MavenLaunchConstants.ATTR_POM_DIR, "${workspace_loc}/foo/bar"), null);
launcher.appendRuntimeSpecificArguments("3.3.3", arguments, configuration);
String expectedVmArgs = "-Dmaven.multiModuleProjectDirectory="
+ MavenLaunchUtils.quote(ResourcesPlugin.getWorkspace().getRoot().getLocation().append("foo").toOSString());
Expand All @@ -114,7 +124,7 @@ public void testGetVMArgumentsSubstituteMultiModuleDir() throws Exception {
@Test
public void testGlobalSettingsProgramArguments() throws Exception {
IMavenConfiguration mavenConfig = MavenPlugin.getMavenConfiguration();
MockLaunchConfiguration configuration = getLaunchConfiguration("projects/444262_settings");
ILaunchConfiguration configuration = getLaunchConfiguration("projects/444262_settings");
try {
performDummyLaunch(configuration);
assertArrayEquals(new String[] {"-B"}, runner.getConfiguration().getProgramArguments());
Expand All @@ -139,7 +149,7 @@ public void testGlobalSettingsProgramArguments() throws Exception {
@Test
public void testUserSettingsProgramArguments() throws Exception {
IMavenConfiguration mavenConfig = MavenPlugin.getMavenConfiguration();
MockLaunchConfiguration configuration = getLaunchConfiguration("projects/444262_settings");
ILaunchConfiguration configuration = getLaunchConfiguration("projects/444262_settings");
try {
mavenConfig.setUserSettingsFile(new File("settings_empty.xml").getAbsolutePath());
performDummyLaunch(configuration);
Expand All @@ -163,11 +173,38 @@ private void performDummyLaunch(ILaunchConfiguration configuration) throws Excep
}
}

private MockLaunchConfiguration getLaunchConfiguration(String pomDirectory) {
private ILaunchConfiguration getLaunchConfiguration(String pomDirectory) throws CoreException {
File file = new File(pomDirectory);
String absPomDir = file.getAbsolutePath();
Map<String, Object> attributes = new HashMap<>();
attributes.put(MavenLaunchConstants.ATTR_POM_DIR, absPomDir);
return new MockLaunchConfiguration(attributes);
return mockLaunchConfiguration(attributes, null);
}

@SuppressWarnings("unchecked")
static ILaunchConfiguration mockLaunchConfiguration(Map<String, Object> attributes, ILaunchConfigurationType type)
throws CoreException {
ILaunchConfiguration config = mock(ILaunchConfiguration.class);
when(config.getType()).thenReturn(type);
when(config.getAttribute(anyString(), anyBoolean())).then(returnAttributeOrDefault(attributes));
when(config.getAttribute(anyString(), anyInt())).then(returnAttributeOrDefault(attributes));
//Use any() matcher because that one also matches null-arguments
when(config.getAttribute(anyString(), (List<String>) any())).then(returnAttributeOrDefault(attributes));
when(config.getAttribute(anyString(), (Set<String>) any())).then(returnAttributeOrDefault(attributes));
when(config.getAttribute(anyString(), (Map<String, String>) any())).then(returnAttributeOrDefault(attributes));
when(config.getAttribute(anyString(), (String) any())).then(returnAttributeOrDefault(attributes));
when(config.getAttributes()).thenReturn(attributes);
when(config.hasAttribute(anyString())).thenAnswer(a -> attributes.containsKey(a.getArgument(0)));
return config;
}

private static <T> Answer<T> returnAttributeOrDefault(Map<String, Object> attributes) {
return (Answer<T>) a -> {
String attributeName = a.getArgument(0);
T defaultValue = a.getArgument(1);
@SuppressWarnings("unchecked")
T attr = (T) attributes.get(attributeName);
return attr == null ? defaultValue : attr;
};
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,17 +22,18 @@
import java.util.Map;

import org.junit.Test;
import org.mockito.Mockito;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationType;
import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants;
import org.eclipse.jdt.launching.IRuntimeClasspathEntry;

import org.eclipse.m2e.actions.MavenLaunchConstants;
import org.eclipse.m2e.core.project.ResolverConfiguration;
import org.eclipse.m2e.jdt.internal.launch.MavenRuntimeClasspathProvider;
import org.eclipse.m2e.tests.common.AbstractMavenProjectTestCase;
import org.eclipse.m2e.tests.mocks.MockLaunchConfiguration;
import org.eclipse.m2e.tests.mocks.MockLaunchConfigurationType;


public class MavenRuntimeClasspathProviderTest extends AbstractMavenProjectTestCase {
Expand Down Expand Up @@ -128,7 +129,8 @@ private void runClasspathScopeTest(String baseDir, String[] pomNames,
String... expectedBinFolders)
throws Exception {
importProjects(baseDir, pomNames, new ResolverConfiguration());
MockLaunchConfiguration configuration = getAppLaunchConfiguration(baseDir + "/" + subModuleWithLaunch);
ILaunchConfiguration configuration = getLaunchConfiguration(baseDir + "/" + subModuleWithLaunch,
MavenRuntimeClasspathProvider.JDT_JAVA_APPLICATION);
configuration.getAttributes().put(IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME,
subModuleWithLaunch);
configuration.getAttributes().put(IJavaLaunchConfigurationConstants.ATTR_EXCLUDE_TEST_CODE, useRuntimeScope);
Expand Down Expand Up @@ -157,7 +159,8 @@ private void assertResolveClasspathEndsWithFolders(

private void runAddJunit5DepsTest(String projectName, String... expectedJars) throws IOException, CoreException {
importProject("projects/" + projectName + "/pom.xml");
MockLaunchConfiguration configuration = getTestLaunchConfiguration("projects/" + projectName);
ILaunchConfiguration configuration = getLaunchConfiguration("projects/" + projectName,
MavenRuntimeClasspathProvider.JDT_JUNIT_TEST);
configuration.getAttributes().put("org.eclipse.jdt.junit.TEST_KIND", "org.eclipse.jdt.junit.loader.junit5");
configuration.getAttributes().put(IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME, projectName);
MavenRuntimeClasspathProvider mavenRuntimeClasspathProvider = new MavenRuntimeClasspathProvider();
Expand Down Expand Up @@ -187,19 +190,13 @@ private void assertResolveClasspathEndsWithJars(IRuntimeClasspathEntry[] resolve
assertEquals(jars.length, resolveClasspath.length - i);
}

private MockLaunchConfiguration getAppLaunchConfiguration(String pomDirectory) {
return getLaunchConfiguration(pomDirectory, MavenRuntimeClasspathProvider.JDT_JAVA_APPLICATION);
}

private MockLaunchConfiguration getTestLaunchConfiguration(String pomDirectory) {
return getLaunchConfiguration(pomDirectory, MavenRuntimeClasspathProvider.JDT_JUNIT_TEST);
}

private MockLaunchConfiguration getLaunchConfiguration(String pomDirectory, String type) {
private ILaunchConfiguration getLaunchConfiguration(String pomDirectory, String type) throws CoreException {
File file = new File(pomDirectory);
String absPomDir = file.getAbsolutePath();
Map<String, Object> attributes = new HashMap<>();
attributes.put(MavenLaunchConstants.ATTR_POM_DIR, absPomDir);
return new MockLaunchConfiguration(attributes, new MockLaunchConfigurationType(Map.of("id", type)));
ILaunchConfigurationType launchConfigurationType = Mockito.mock(ILaunchConfigurationType.class);
Mockito.when(launchConfigurationType.getAttribute("id")).thenReturn(type);
return MavenLaunchDelegateTest.mockLaunchConfiguration(attributes, launchConfigurationType);
}
}
Loading

0 comments on commit 7fd1fc3

Please sign in to comment.