blob: c5f8db6d536a7c15e9a610ec322177deaf2c061a [file] [log] [blame]
/*
* Copyright (C) 2018 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.dx.mockito.inline;
import android.util.Log;
import org.mockito.invocation.MockHandler;
import org.mockito.mock.MockCreationSettings;
import org.mockito.plugins.MockMaker;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
/**
* Multiplexes multiple mock makers
*/
public final class MockMakerMultiplexer implements MockMaker {
private static final String LOG_TAG = MockMakerMultiplexer.class.getSimpleName();
private final static MockMaker[] MOCK_MAKERS;
static {
String[] potentialMockMakers = new String[] {
"com.android.dx.mockito.inline.InlineStaticMockMaker",
InlineDexmakerMockMaker.class.getName()
};
ArrayList<MockMaker> mockMakers = new ArrayList<>();
for (String potentialMockMaker : potentialMockMakers) {
try {
Class<? extends MockMaker> mockMakerClass = (Class<? extends MockMaker>)
Class.forName(potentialMockMaker);
mockMakers.add(mockMakerClass.getDeclaredConstructor().newInstance());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException
| NoSuchMethodException | InvocationTargetException e) {
if (potentialMockMaker.equals(InlineDexmakerMockMaker.class.getName())) {
Log.e(LOG_TAG, "Could not init mockmaker " + potentialMockMaker, e);
} else {
// Additional mock makers might not be loaded
Log.e(LOG_TAG, "Could not init mockmaker " + potentialMockMaker);
}
}
}
MOCK_MAKERS = mockMakers.toArray(new MockMaker[]{});
}
@Override
public <T> T createMock(MockCreationSettings<T> settings, MockHandler handler) {
for (MockMaker mockMaker : MOCK_MAKERS) {
T mock = mockMaker.createMock(settings, handler);
if (mock != null) {
return mock;
}
}
return null;
}
@Override
public MockHandler getHandler(Object mock) {
for (MockMaker mockMaker : MOCK_MAKERS) {
MockHandler handler = mockMaker.getHandler(mock);
if (handler != null) {
return handler;
}
}
return null;
}
@Override
public void resetMock(Object mock, MockHandler newHandler, MockCreationSettings settings) {
for (MockMaker mockMaker : MOCK_MAKERS) {
mockMaker.resetMock(mock, newHandler, settings);
}
}
@Override
public TypeMockability isTypeMockable(Class<?> type) {
for (MockMaker mockMaker : MOCK_MAKERS) {
TypeMockability mockability = mockMaker.isTypeMockable(type);
if (mockability != null) {
return mockability;
}
}
return null;
}
}