Created
May 1, 2019 17:13
-
-
Save mitchtabian/6ff1e922065b72c3d1ad7ff0e585e8a9 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import org.junit.jupiter.api.extension.ExtensionContext; | |
import org.junit.jupiter.api.extension.ExtensionContext.Namespace; | |
import org.junit.jupiter.api.extension.ExtensionContext.Store; | |
import org.junit.jupiter.api.extension.ParameterContext; | |
import org.junit.jupiter.api.extension.ParameterResolver; | |
import org.junit.jupiter.api.extension.TestInstancePostProcessor; | |
import org.mockito.Mock; | |
import org.mockito.MockitoAnnotations; | |
import java.lang.reflect.Parameter; | |
import static org.mockito.Mockito.mock; | |
public class MockitoExtension | |
implements TestInstancePostProcessor, ParameterResolver { | |
@Override | |
public void postProcessTestInstance(Object testInstance, | |
ExtensionContext context) { | |
MockitoAnnotations.initMocks(testInstance); | |
} | |
@Override | |
public boolean supportsParameter(ParameterContext parameterContext, | |
ExtensionContext extensionContext) { | |
return parameterContext.getParameter().isAnnotationPresent(Mock.class); | |
} | |
@Override | |
public Object resolveParameter(ParameterContext parameterContext, | |
ExtensionContext extensionContext) { | |
return getMock(parameterContext.getParameter(), extensionContext); | |
} | |
private Object getMock(Parameter parameter, | |
ExtensionContext extensionContext) { | |
Class<?> mockType = parameter.getType(); | |
Store mocks = extensionContext | |
.getStore(Namespace.create(MockitoExtension.class, mockType)); | |
String mockName = getMockName(parameter); | |
if (mockName != null) { | |
return mocks.getOrComputeIfAbsent(mockName, | |
key -> mock(mockType, mockName)); | |
} else { | |
return mocks.getOrComputeIfAbsent(mockType.getCanonicalName(), | |
key -> mock(mockType)); | |
} | |
} | |
private String getMockName(Parameter parameter) { | |
String explicitMockName = parameter.getAnnotation(Mock.class).name() | |
.trim(); | |
if (!explicitMockName.isEmpty()) { | |
return explicitMockName; | |
} else if (parameter.isNamePresent()) { | |
return parameter.getName(); | |
} | |
return null; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment