Skip to content

Commit

Permalink
StackWalker.Option not found on Mockito 5.1.0 (#2891)
Browse files Browse the repository at this point in the history
Fixes #2890 

Signed-off-by: Andriy Redko <drreta@gmail.com>
  • Loading branch information
reta committed Jan 30, 2023
1 parent 19ab3ea commit 50b21cf
Show file tree
Hide file tree
Showing 2 changed files with 92 additions and 1 deletion.
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
/*
* Copyright (c) 2007 Mockito contributors
* This program is made available under the terms of the MIT License.
*/
package org.mockito.internal.debugging;

import java.io.Serializable;

import org.mockito.internal.exceptions.stacktrace.StackTraceFilter;
import org.mockito.invocation.Location;

class Java8LocationImpl implements Location, Serializable {

private static final long serialVersionUID = -9054861157390980624L;
// Limit the amount of objects being created, as this class is heavily instantiated:
private static final StackTraceFilter stackTraceFilter = new StackTraceFilter();

private String stackTraceLine;
private String sourceFile;

public Java8LocationImpl(Throwable stackTraceHolder, boolean isInline) {
this(stackTraceFilter, stackTraceHolder, isInline);
}

private Java8LocationImpl(
StackTraceFilter stackTraceFilter, Throwable stackTraceHolder, boolean isInline) {
computeStackTraceInformation(stackTraceFilter, stackTraceHolder, isInline);
}

@Override
public String toString() {
return stackTraceLine;
}

/**
* Eagerly compute the stacktrace line from the stackTraceHolder. Storing the Throwable is
* memory-intensive for tests that have large stacktraces and have a lot of invocations on
* mocks.
*/
private void computeStackTraceInformation(
StackTraceFilter stackTraceFilter, Throwable stackTraceHolder, boolean isInline) {
StackTraceElement filtered = stackTraceFilter.filterFirst(stackTraceHolder, isInline);

// there are corner cases where exception can have a null or empty stack trace
// for example, a custom exception can override getStackTrace() method
if (filtered == null) {
this.stackTraceLine = "-> at <<unknown line>>";
this.sourceFile = "<unknown source file>";
} else {
this.stackTraceLine = "-> at " + filtered;
this.sourceFile = filtered.getFileName();
}
}

@Override
public String getSourceFile() {
return sourceFile;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,45 @@
import org.mockito.invocation.Location;

public final class LocationFactory {
private static final Factory factory = createLocationFactory();

private LocationFactory() {}

public static Location create() {
return create(false);
}

public static Location create(boolean inline) {
return new LocationImpl(inline);
return factory.create(inline);
}

private interface Factory {
Location create(boolean inline);
}

private static Factory createLocationFactory() {
try {
// On some platforms, like Android, the StackWalker APIs may not be
// available, in this case we have to fallback to Java 8 style of stack
// traversing.
Class.forName("java.lang.StackWalker");
return new DefaultLocationFactory();
} catch (ClassNotFoundException e) {
return new Java8LocationFactory();
}
}

private static final class Java8LocationFactory implements Factory {
@Override
public Location create(boolean inline) {
return new Java8LocationImpl(new Throwable(), inline);
}
}

private static final class DefaultLocationFactory implements Factory {
@Override
public Location create(boolean inline) {
return new LocationImpl(inline);
}
}
}

0 comments on commit 50b21cf

Please sign in to comment.