具有私有静态非最终字段的
package sample;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class App {
private static Logger logger = LoggerFactory.getLogger(App.class);
public void doSomething() {
logger.error("Cannot do something");
}
}
try 通过反射设置此字段
package sample;
import org.apache.logging.log4j.core.Logger;
import org.junit.jupiter.api.Test;
import org.springframework.test.util.ReflectionTestUtils;
import static org.mockito.Mockito.mock;
public class AppTest {
@Test
public void doSomething() throws Exception {
App app = new App();
Logger mockedLogger = mock(Logger.class);
ReflectionTestUtils.setField(App.class, "logger", mockedLogger);
}
}
导致非法ArgumentException
Can not set static org.slf4j.Logger field sample.App.logger to org.apache.logging.log4j.core.Logger$MockitoMock$1185285221
java.lang.IllegalArgumentException: Can not set static org.slf4j.Logger field sample.App.logger to org.apache.logging.log4j.core.Logger$MockitoMock$1185285221
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167)
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171)
at sun.reflect.UnsafeStaticObjectFieldAccessorImpl.set(UnsafeStaticObjectFieldAccessorImpl.java:79)
at java.lang.reflect.Field.set(Field.java:764)
at org.springframework.util.ReflectionUtils.setField(ReflectionUtils.java:633)
根据被调用方法的JavaDocs
https://docs.spring.io/spring-framework/docs/5.2.20.RELEASE/javadoc-api/个
在提供的Target Class上设置具有给定名称的静态字段 设置为提供的值.
支持设置静态字段.