blob: d014e871d3e29e472ab9e7cdbb9feec6d9a6c5d1 [file] [log] [blame]
/*
* Copyright (c) 2007 Mockito contributors
* This program is made available under the terms of the MIT License.
*/
package org.mockito.internal.debugging;
import org.mockito.internal.invocation.InvocationMatcher;
import org.mockito.invocation.Invocation;
import java.util.LinkedList;
import java.util.List;
import static org.mockito.internal.util.StringUtil.join;
public class LoggingListener implements FindingsListener {
private final boolean warnAboutUnstubbed;
private final List<String> argMismatchStubs = new LinkedList<String>();
private final List<String> unusedStubs = new LinkedList<String>();
private final List<String> unstubbedCalls = new LinkedList<String>();
public LoggingListener(boolean warnAboutUnstubbed) {
this.warnAboutUnstubbed = warnAboutUnstubbed;
}
public void foundStubCalledWithDifferentArgs(Invocation unused, InvocationMatcher unstubbed) {
//TODO there is not good reason we should get Invocation and InvocationMatcher here
// we should pass 2 InvocationMatchers and testing is easier
// it's also confusing that unstubbed invocation is passed as InvocationMatcher (should be rather Invocation)
//this information comes in pairs
String index = Integer.toString(indexOfNextPair(argMismatchStubs.size()));
//making sure indentation is correct
String padding = index.replaceAll("\\d", " ");
argMismatchStubs.add(index + ". Stubbed " + unused.getLocation());
argMismatchStubs.add(padding + " Invoked " + unstubbed.getInvocation().getLocation());
}
static int indexOfNextPair(int collectionSize) {
return (collectionSize / 2) + 1;
}
public void foundUnusedStub(Invocation unused) {
unusedStubs.add((unusedStubs.size() + 1) + ". " + unused.getLocation());
}
public void foundUnstubbed(InvocationMatcher unstubbed) {
if (warnAboutUnstubbed) {
unstubbedCalls.add((unstubbedCalls.size() + 1) + ". " + unstubbed.getInvocation().getLocation());
}
}
public String getStubbingInfo() {
if (argMismatchStubs.isEmpty() && unusedStubs.isEmpty() && unstubbedCalls.isEmpty()) {
return "";
}
List<String> lines = new LinkedList<String>();
lines.add("[Mockito] Additional stubbing information (see javadoc for StubbingInfo class):");
if (!argMismatchStubs.isEmpty()) {
lines.add("[Mockito]");
lines.add("[Mockito] Argument mismatch between stubbing and actual invocation (is stubbing correct in the test?):");
lines.add("[Mockito]");
addOrderedList(lines, argMismatchStubs);
}
if (!unusedStubs.isEmpty()) {
lines.add("[Mockito]");
lines.add("[Mockito] Unused stubbing (perhaps can be removed from the test?):");
lines.add("[Mockito]");
addOrderedList(lines, unusedStubs);
}
if (!unstubbedCalls.isEmpty()) {
lines.add("[Mockito]");
lines.add("[Mockito] Unstubbed method invocations (perhaps missing stubbing in the test?):");
lines.add("[Mockito]");
addOrderedList(lines, unstubbedCalls);
}
return join("", lines);
}
private void addOrderedList(List<String> target, List<String> additions) {
for (String a : additions) {
target.add("[Mockito] " + a);
}
}
}