Polish CustomizableTraceInterceptor[Tests]
This commit is contained in:
parent
1058fed339
commit
5e31856aaa
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2002-2021 the original author or authors.
|
* Copyright 2002-2023 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -62,6 +62,7 @@ import org.springframework.util.StringUtils;
|
||||||
*
|
*
|
||||||
* @author Rob Harrop
|
* @author Rob Harrop
|
||||||
* @author Juergen Hoeller
|
* @author Juergen Hoeller
|
||||||
|
* @author Sam Brannen
|
||||||
* @since 1.2
|
* @since 1.2
|
||||||
* @see #setEnterMessage
|
* @see #setEnterMessage
|
||||||
* @see #setExitMessage
|
* @see #setExitMessage
|
||||||
|
@ -295,43 +296,38 @@ public class CustomizableTraceInterceptor extends AbstractTraceInterceptor {
|
||||||
protected String replacePlaceholders(String message, MethodInvocation methodInvocation,
|
protected String replacePlaceholders(String message, MethodInvocation methodInvocation,
|
||||||
@Nullable Object returnValue, @Nullable Throwable throwable, long invocationTime) {
|
@Nullable Object returnValue, @Nullable Throwable throwable, long invocationTime) {
|
||||||
|
|
||||||
Matcher matcher = PATTERN.matcher(message);
|
|
||||||
Object target = methodInvocation.getThis();
|
Object target = methodInvocation.getThis();
|
||||||
Assert.state(target != null, "Target must not be null");
|
Assert.state(target != null, "Target must not be null");
|
||||||
|
|
||||||
StringBuilder output = new StringBuilder();
|
StringBuilder output = new StringBuilder();
|
||||||
|
Matcher matcher = PATTERN.matcher(message);
|
||||||
while (matcher.find()) {
|
while (matcher.find()) {
|
||||||
String match = matcher.group();
|
String match = matcher.group();
|
||||||
if (PLACEHOLDER_METHOD_NAME.equals(match)) {
|
switch (match) {
|
||||||
matcher.appendReplacement(output, Matcher.quoteReplacement(methodInvocation.getMethod().getName()));
|
case PLACEHOLDER_METHOD_NAME -> matcher.appendReplacement(output,
|
||||||
}
|
Matcher.quoteReplacement(methodInvocation.getMethod().getName()));
|
||||||
else if (PLACEHOLDER_TARGET_CLASS_NAME.equals(match)) {
|
case PLACEHOLDER_TARGET_CLASS_NAME -> {
|
||||||
String className = getClassForLogging(target).getName();
|
String className = getClassForLogging(target).getName();
|
||||||
matcher.appendReplacement(output, Matcher.quoteReplacement(className));
|
matcher.appendReplacement(output, Matcher.quoteReplacement(className));
|
||||||
}
|
}
|
||||||
else if (PLACEHOLDER_TARGET_CLASS_SHORT_NAME.equals(match)) {
|
case PLACEHOLDER_TARGET_CLASS_SHORT_NAME -> {
|
||||||
String shortName = ClassUtils.getShortName(getClassForLogging(target));
|
String shortName = ClassUtils.getShortName(getClassForLogging(target));
|
||||||
matcher.appendReplacement(output, Matcher.quoteReplacement(shortName));
|
matcher.appendReplacement(output, Matcher.quoteReplacement(shortName));
|
||||||
}
|
}
|
||||||
else if (PLACEHOLDER_ARGUMENTS.equals(match)) {
|
case PLACEHOLDER_ARGUMENTS -> matcher.appendReplacement(output,
|
||||||
matcher.appendReplacement(output,
|
|
||||||
Matcher.quoteReplacement(StringUtils.arrayToCommaDelimitedString(methodInvocation.getArguments())));
|
Matcher.quoteReplacement(StringUtils.arrayToCommaDelimitedString(methodInvocation.getArguments())));
|
||||||
}
|
case PLACEHOLDER_ARGUMENT_TYPES -> appendArgumentTypes(methodInvocation, matcher, output);
|
||||||
else if (PLACEHOLDER_ARGUMENT_TYPES.equals(match)) {
|
case PLACEHOLDER_RETURN_VALUE -> appendReturnValue(methodInvocation, matcher, output, returnValue);
|
||||||
appendArgumentTypes(methodInvocation, matcher, output);
|
case PLACEHOLDER_EXCEPTION -> {
|
||||||
}
|
if (throwable != null) {
|
||||||
else if (PLACEHOLDER_RETURN_VALUE.equals(match)) {
|
matcher.appendReplacement(output, Matcher.quoteReplacement(throwable.toString()));
|
||||||
appendReturnValue(methodInvocation, matcher, output, returnValue);
|
}
|
||||||
}
|
}
|
||||||
else if (throwable != null && PLACEHOLDER_EXCEPTION.equals(match)) {
|
case PLACEHOLDER_INVOCATION_TIME -> matcher.appendReplacement(output, Long.toString(invocationTime));
|
||||||
matcher.appendReplacement(output, Matcher.quoteReplacement(throwable.toString()));
|
default -> {
|
||||||
}
|
// Should not happen since placeholders are checked earlier.
|
||||||
else if (PLACEHOLDER_INVOCATION_TIME.equals(match)) {
|
throw new IllegalArgumentException("Unknown placeholder [" + match + "]");
|
||||||
matcher.appendReplacement(output, Long.toString(invocationTime));
|
}
|
||||||
}
|
|
||||||
else {
|
|
||||||
// Should not happen since placeholders are checked earlier.
|
|
||||||
throw new IllegalArgumentException("Unknown placeholder [" + match + "]");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
matcher.appendTail(output);
|
matcher.appendTail(output);
|
||||||
|
@ -348,7 +344,7 @@ public class CustomizableTraceInterceptor extends AbstractTraceInterceptor {
|
||||||
* @param output the {@code StringBuilder} to write output to
|
* @param output the {@code StringBuilder} to write output to
|
||||||
* @param returnValue the value returned by the method invocation.
|
* @param returnValue the value returned by the method invocation.
|
||||||
*/
|
*/
|
||||||
private void appendReturnValue(
|
private static void appendReturnValue(
|
||||||
MethodInvocation methodInvocation, Matcher matcher, StringBuilder output, @Nullable Object returnValue) {
|
MethodInvocation methodInvocation, Matcher matcher, StringBuilder output, @Nullable Object returnValue) {
|
||||||
|
|
||||||
if (methodInvocation.getMethod().getReturnType() == void.class) {
|
if (methodInvocation.getMethod().getReturnType() == void.class) {
|
||||||
|
@ -372,7 +368,7 @@ public class CustomizableTraceInterceptor extends AbstractTraceInterceptor {
|
||||||
* @param matcher the {@code Matcher} containing the state of the output
|
* @param matcher the {@code Matcher} containing the state of the output
|
||||||
* @param output the {@code StringBuilder} containing the output
|
* @param output the {@code StringBuilder} containing the output
|
||||||
*/
|
*/
|
||||||
private void appendArgumentTypes(MethodInvocation methodInvocation, Matcher matcher, StringBuilder output) {
|
private static void appendArgumentTypes(MethodInvocation methodInvocation, Matcher matcher, StringBuilder output) {
|
||||||
Class<?>[] argumentTypes = methodInvocation.getMethod().getParameterTypes();
|
Class<?>[] argumentTypes = methodInvocation.getMethod().getParameterTypes();
|
||||||
String[] argumentTypeShortNames = new String[argumentTypes.length];
|
String[] argumentTypeShortNames = new String[argumentTypes.length];
|
||||||
for (int i = 0; i < argumentTypeShortNames.length; i++) {
|
for (int i = 0; i < argumentTypeShortNames.length; i++) {
|
||||||
|
@ -387,7 +383,7 @@ public class CustomizableTraceInterceptor extends AbstractTraceInterceptor {
|
||||||
* that are not specified as constants on this class and throws an
|
* that are not specified as constants on this class and throws an
|
||||||
* {@code IllegalArgumentException} if so.
|
* {@code IllegalArgumentException} if so.
|
||||||
*/
|
*/
|
||||||
private void checkForInvalidPlaceholders(String message) throws IllegalArgumentException {
|
private static void checkForInvalidPlaceholders(String message) throws IllegalArgumentException {
|
||||||
Matcher matcher = PATTERN.matcher(message);
|
Matcher matcher = PATTERN.matcher(message);
|
||||||
while (matcher.find()) {
|
while (matcher.find()) {
|
||||||
String match = matcher.group();
|
String match = matcher.group();
|
||||||
|
|
|
@ -27,73 +27,79 @@ import static org.mockito.BDDMockito.given;
|
||||||
import static org.mockito.Mockito.mock;
|
import static org.mockito.Mockito.mock;
|
||||||
import static org.mockito.Mockito.times;
|
import static org.mockito.Mockito.times;
|
||||||
import static org.mockito.Mockito.verify;
|
import static org.mockito.Mockito.verify;
|
||||||
|
import static org.springframework.aop.interceptor.CustomizableTraceInterceptor.PLACEHOLDER_ARGUMENTS;
|
||||||
|
import static org.springframework.aop.interceptor.CustomizableTraceInterceptor.PLACEHOLDER_ARGUMENT_TYPES;
|
||||||
|
import static org.springframework.aop.interceptor.CustomizableTraceInterceptor.PLACEHOLDER_EXCEPTION;
|
||||||
|
import static org.springframework.aop.interceptor.CustomizableTraceInterceptor.PLACEHOLDER_INVOCATION_TIME;
|
||||||
|
import static org.springframework.aop.interceptor.CustomizableTraceInterceptor.PLACEHOLDER_METHOD_NAME;
|
||||||
|
import static org.springframework.aop.interceptor.CustomizableTraceInterceptor.PLACEHOLDER_RETURN_VALUE;
|
||||||
|
import static org.springframework.aop.interceptor.CustomizableTraceInterceptor.PLACEHOLDER_TARGET_CLASS_NAME;
|
||||||
|
import static org.springframework.aop.interceptor.CustomizableTraceInterceptor.PLACEHOLDER_TARGET_CLASS_SHORT_NAME;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* Tests for {@link CustomizableTraceInterceptor}.
|
||||||
|
*
|
||||||
* @author Rob Harrop
|
* @author Rob Harrop
|
||||||
* @author Rick Evans
|
* @author Rick Evans
|
||||||
* @author Juergen Hoeller
|
* @author Juergen Hoeller
|
||||||
* @author Chris Beams
|
* @author Chris Beams
|
||||||
|
* @author Sam Brannen
|
||||||
*/
|
*/
|
||||||
public class CustomizableTraceInterceptorTests {
|
class CustomizableTraceInterceptorTests {
|
||||||
|
|
||||||
|
private final CustomizableTraceInterceptor interceptor = new CustomizableTraceInterceptor();
|
||||||
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testSetEmptyEnterMessage() {
|
void setEmptyEnterMessage() {
|
||||||
// Must not be able to set empty enter message
|
// Must not be able to set empty enter message
|
||||||
assertThatIllegalArgumentException().isThrownBy(() ->
|
assertThatIllegalArgumentException().isThrownBy(() -> interceptor.setEnterMessage(""));
|
||||||
new CustomizableTraceInterceptor().setEnterMessage(""));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testSetEnterMessageWithReturnValuePlaceholder() {
|
void setEnterMessageWithReturnValuePlaceholder() {
|
||||||
// Must not be able to set enter message with return value placeholder
|
// Must not be able to set enter message with return value placeholder
|
||||||
assertThatIllegalArgumentException().isThrownBy(() ->
|
assertThatIllegalArgumentException().isThrownBy(() -> interceptor.setEnterMessage(PLACEHOLDER_RETURN_VALUE));
|
||||||
new CustomizableTraceInterceptor().setEnterMessage(CustomizableTraceInterceptor.PLACEHOLDER_RETURN_VALUE));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testSetEnterMessageWithExceptionPlaceholder() {
|
void setEnterMessageWithExceptionPlaceholder() {
|
||||||
// Must not be able to set enter message with exception placeholder
|
// Must not be able to set enter message with exception placeholder
|
||||||
assertThatIllegalArgumentException().isThrownBy(() ->
|
assertThatIllegalArgumentException().isThrownBy(() -> interceptor.setEnterMessage(PLACEHOLDER_EXCEPTION));
|
||||||
new CustomizableTraceInterceptor().setEnterMessage(CustomizableTraceInterceptor.PLACEHOLDER_EXCEPTION));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testSetEnterMessageWithInvocationTimePlaceholder() {
|
void setEnterMessageWithInvocationTimePlaceholder() {
|
||||||
// Must not be able to set enter message with invocation time placeholder
|
// Must not be able to set enter message with invocation time placeholder
|
||||||
assertThatIllegalArgumentException().isThrownBy(() ->
|
assertThatIllegalArgumentException().isThrownBy(() -> interceptor.setEnterMessage(PLACEHOLDER_INVOCATION_TIME));
|
||||||
new CustomizableTraceInterceptor().setEnterMessage(CustomizableTraceInterceptor.PLACEHOLDER_INVOCATION_TIME));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testSetEmptyExitMessage() {
|
void setEmptyExitMessage() {
|
||||||
// Must not be able to set empty exit message
|
// Must not be able to set empty exit message
|
||||||
assertThatIllegalArgumentException().isThrownBy(() ->
|
assertThatIllegalArgumentException().isThrownBy(() -> interceptor.setExitMessage(""));
|
||||||
new CustomizableTraceInterceptor().setExitMessage(""));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testSetExitMessageWithExceptionPlaceholder() {
|
void setExitMessageWithExceptionPlaceholder() {
|
||||||
// Must not be able to set exit message with exception placeholder
|
// Must not be able to set exit message with exception placeholder
|
||||||
assertThatIllegalArgumentException().isThrownBy(() ->
|
assertThatIllegalArgumentException().isThrownBy(() -> interceptor.setExitMessage(PLACEHOLDER_EXCEPTION));
|
||||||
new CustomizableTraceInterceptor().setExitMessage(CustomizableTraceInterceptor.PLACEHOLDER_EXCEPTION));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testSetEmptyExceptionMessage() {
|
void setEmptyExceptionMessage() {
|
||||||
// Must not be able to set empty exception message
|
// Must not be able to set empty exception message
|
||||||
assertThatIllegalArgumentException().isThrownBy(() ->
|
assertThatIllegalArgumentException().isThrownBy(() -> interceptor.setExceptionMessage(""));
|
||||||
new CustomizableTraceInterceptor().setExceptionMessage(""));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testSetExceptionMethodWithReturnValuePlaceholder() {
|
void setExceptionMethodWithReturnValuePlaceholder() {
|
||||||
// Must not be able to set exception message with return value placeholder
|
// Must not be able to set exception message with return value placeholder
|
||||||
assertThatIllegalArgumentException().isThrownBy(() ->
|
assertThatIllegalArgumentException().isThrownBy(() -> interceptor.setExceptionMessage(PLACEHOLDER_RETURN_VALUE));
|
||||||
new CustomizableTraceInterceptor().setExceptionMessage(CustomizableTraceInterceptor.PLACEHOLDER_RETURN_VALUE));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testSunnyDayPathLogsCorrectly() throws Throwable {
|
void sunnyDayPathLogsCorrectly() throws Throwable {
|
||||||
MethodInvocation methodInvocation = mock();
|
MethodInvocation methodInvocation = mock();
|
||||||
given(methodInvocation.getMethod()).willReturn(String.class.getMethod("toString"));
|
given(methodInvocation.getMethod()).willReturn(String.class.getMethod("toString"));
|
||||||
given(methodInvocation.getThis()).willReturn(this);
|
given(methodInvocation.getThis()).willReturn(this);
|
||||||
|
@ -108,7 +114,7 @@ public class CustomizableTraceInterceptorTests {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testExceptionPathLogsCorrectly() throws Throwable {
|
void exceptionPathLogsCorrectly() throws Throwable {
|
||||||
MethodInvocation methodInvocation = mock();
|
MethodInvocation methodInvocation = mock();
|
||||||
|
|
||||||
IllegalArgumentException exception = new IllegalArgumentException();
|
IllegalArgumentException exception = new IllegalArgumentException();
|
||||||
|
@ -120,15 +126,14 @@ public class CustomizableTraceInterceptorTests {
|
||||||
given(log.isTraceEnabled()).willReturn(true);
|
given(log.isTraceEnabled()).willReturn(true);
|
||||||
|
|
||||||
CustomizableTraceInterceptor interceptor = new StubCustomizableTraceInterceptor(log);
|
CustomizableTraceInterceptor interceptor = new StubCustomizableTraceInterceptor(log);
|
||||||
assertThatIllegalArgumentException().isThrownBy(() ->
|
assertThatIllegalArgumentException().isThrownBy(() -> interceptor.invoke(methodInvocation));
|
||||||
interceptor.invoke(methodInvocation));
|
|
||||||
|
|
||||||
verify(log).trace(anyString());
|
verify(log).trace(anyString());
|
||||||
verify(log).trace(anyString(), eq(exception));
|
verify(log).trace(anyString(), eq(exception));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testSunnyDayPathLogsCorrectlyWithPrettyMuchAllPlaceholdersMatching() throws Throwable {
|
void sunnyDayPathLogsCorrectlyWithPrettyMuchAllPlaceholdersMatching() throws Throwable {
|
||||||
MethodInvocation methodInvocation = mock();
|
MethodInvocation methodInvocation = mock();
|
||||||
|
|
||||||
given(methodInvocation.getMethod()).willReturn(String.class.getMethod("toString", new Class[0]));
|
given(methodInvocation.getMethod()).willReturn(String.class.getMethod("toString", new Class[0]));
|
||||||
|
@ -141,18 +146,18 @@ public class CustomizableTraceInterceptorTests {
|
||||||
|
|
||||||
CustomizableTraceInterceptor interceptor = new StubCustomizableTraceInterceptor(log);
|
CustomizableTraceInterceptor interceptor = new StubCustomizableTraceInterceptor(log);
|
||||||
interceptor.setEnterMessage(new StringBuilder()
|
interceptor.setEnterMessage(new StringBuilder()
|
||||||
.append("Entering the '").append(CustomizableTraceInterceptor.PLACEHOLDER_METHOD_NAME)
|
.append("Entering the '").append(PLACEHOLDER_METHOD_NAME)
|
||||||
.append("' method of the [").append(CustomizableTraceInterceptor.PLACEHOLDER_TARGET_CLASS_NAME)
|
.append("' method of the [").append(PLACEHOLDER_TARGET_CLASS_NAME)
|
||||||
.append("] class with the following args (").append(CustomizableTraceInterceptor.PLACEHOLDER_ARGUMENTS)
|
.append("] class with the following args (").append(PLACEHOLDER_ARGUMENTS)
|
||||||
.append(") and arg types (").append(CustomizableTraceInterceptor.PLACEHOLDER_ARGUMENT_TYPES)
|
.append(") and arg types (").append(PLACEHOLDER_ARGUMENT_TYPES)
|
||||||
.append(").").toString());
|
.append(").").toString());
|
||||||
interceptor.setExitMessage(new StringBuilder()
|
interceptor.setExitMessage(new StringBuilder()
|
||||||
.append("Exiting the '").append(CustomizableTraceInterceptor.PLACEHOLDER_METHOD_NAME)
|
.append("Exiting the '").append(PLACEHOLDER_METHOD_NAME)
|
||||||
.append("' method of the [").append(CustomizableTraceInterceptor.PLACEHOLDER_TARGET_CLASS_SHORT_NAME)
|
.append("' method of the [").append(PLACEHOLDER_TARGET_CLASS_SHORT_NAME)
|
||||||
.append("] class with the following args (").append(CustomizableTraceInterceptor.PLACEHOLDER_ARGUMENTS)
|
.append("] class with the following args (").append(PLACEHOLDER_ARGUMENTS)
|
||||||
.append(") and arg types (").append(CustomizableTraceInterceptor.PLACEHOLDER_ARGUMENT_TYPES)
|
.append(") and arg types (").append(PLACEHOLDER_ARGUMENT_TYPES)
|
||||||
.append("), returning '").append(CustomizableTraceInterceptor.PLACEHOLDER_RETURN_VALUE)
|
.append("), returning '").append(PLACEHOLDER_RETURN_VALUE)
|
||||||
.append("' and taking '").append(CustomizableTraceInterceptor.PLACEHOLDER_INVOCATION_TIME)
|
.append("' and taking '").append(PLACEHOLDER_INVOCATION_TIME)
|
||||||
.append("' this long.").toString());
|
.append("' this long.").toString());
|
||||||
interceptor.invoke(methodInvocation);
|
interceptor.invoke(methodInvocation);
|
||||||
|
|
||||||
|
@ -165,7 +170,7 @@ public class CustomizableTraceInterceptorTests {
|
||||||
|
|
||||||
private final Log log;
|
private final Log log;
|
||||||
|
|
||||||
public StubCustomizableTraceInterceptor(Log log) {
|
StubCustomizableTraceInterceptor(Log log) {
|
||||||
super.setUseDynamicLogger(false);
|
super.setUseDynamicLogger(false);
|
||||||
this.log = log;
|
this.log = log;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue