blob: 5515b173ffa7ce7f0093f029b106ae1c9563f587 [file] [log] [blame]
// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.base.test;
import org.junit.rules.TestRule;
import org.junit.runner.Description;
import org.junit.runners.model.Statement;
import org.chromium.base.Log;
import org.chromium.build.annotations.CheckDiscard;
/**
* Attempts to provide additional information for Mockito errors that are hard to diagnose,
* b/147584922 in particular.
*/
class MockitoErrorHandler implements TestRule {
private static final String TAG = "MockitoErrorHandler";
private static final String MOCKITO_ERROR =
"Note: Proguard optimization is enabled and may cause exceptions when Mocking Derived"
+ " classes, or classes that implement interfaces whose methods are not kept. You"
+ " may need to add org.chromium.build.annotations.MockedInTests to such classes.";
@CheckDiscard("")
private void removedMethodUnderRelease() {}
@Override
public Statement apply(Statement base, Description description) {
return new Statement() {
@Override
public void evaluate() throws Throwable {
try {
base.evaluate();
} catch (Throwable e) {
if ((e instanceof AbstractMethodError)
// UnfinishedStubbingException isn't on our build path.
|| e.getClass().getSimpleName().equals("UnfinishedStubbingException")) {
try {
// Detect if code is being optimized.
getClass().getDeclaredMethod("removedMethodUnderRelease");
} catch (NoSuchMethodException ignored) {
Log.e(TAG, MOCKITO_ERROR);
}
}
throw e;
}
}
};
}
}