我有一个带有private static final字段的类,不幸的是,我需要在运行时更改.
使用反射我得到这个错误: java.lang.IllegalAccessException: Can not set static final boolean field
有没有办法改变价值?
Field hack = WarpTransform2D.class.getDeclaredField("USE_HACK");
hack.setAccessible(true);
hack.set(null, true);
Run Code Online (Sandbox Code Playgroud) 我有一些测试代码,它调用Java记录器来报告其状态.在JUnit测试代码中,我想验证在此记录器中是否输入了正确的日志.以下内容:
methodUnderTest(bool x){
if(x)
logger.info("x happened")
}
@Test tester(){
// perhaps setup a logger first.
methodUnderTest(true);
assertXXXXXX(loggedLevel(),Level.INFO);
}
Run Code Online (Sandbox Code Playgroud)
我想这可以通过特殊改编的记录器(或处理程序或格式化程序)来完成,但我更愿意重用已经存在的解决方案.(而且,说实话,我不清楚如何从记录器获取logRecord,但假设这是可能的.)
我在我的类中使用私有静态最终LOGGER字段,我希望LOGGER.isInfoEnabled()方法返回false.如何使用mockito或jMockit模拟静态final字段
我的班级是:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Class1 {
private static final Logger LOGGER = LoggerFactory.getLogger(Class1.class);
public boolean demoMethod() {
System.out.println("Demo started");
if (LOGGER.isInfoEnabled()) {
System.out.println("@@@@@@@@@@@@@@ ------- info is enabled");
} else {
System.out.println("info is disabled");
}
return LOGGER.isInfoEnabled();
}
}
Run Code Online (Sandbox Code Playgroud)
它的junit是:
import mockit.Mocked;
import mockit.NonStrictExpectations;
import org.mockito.InjectMocks;
import org.mockito.MockitoAnnotations;
import org.slf4j.Logger;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import static org.testng.Assert.*;
import com.source.Class1;
public class MyTest {
@InjectMocks
Class1 cls1;
@BeforeMethod
public void initMocks() { …Run Code Online (Sandbox Code Playgroud) 有没有办法验证异常是否被捕获?我的意思是在我的方法中有一种情况,我应该捕获异常,在测试中,我想验证异常是否真正被捕获.
我有一个方法,它在内部调用一个名为“burn”的方法,该方法会引发数据异常,如果是这样,那么它会被捕获在 try/catch 块中并记录到记录器中。然而,该类使用注释 @Slf4j 和 lombok.extern.slf4j:
@Slf4j
public class MyClass {
private void myMethod(Type parameter) throws Exception {
try {
dataGateway.burn(id);
}
catch {
log.error("Failed to burn({})",id);
}
}
Run Code Online (Sandbox Code Playgroud)
我已经模拟了数据网关,并让它在调用 burn 时抛出异常,我知道异常已被捕获,但如何使用验证来断言记录器被调用为 .error?DateGateway dBMock = mock(DateGateway.class);
when(dBMock.burn(anyString())).thenReturn(new DataException("exception"));
Run Code Online (Sandbox Code Playgroud) 我有一个混合了 Spring Boot、Jersey 和 Camel 应用程序的应用程序。它从一个 Spring Boot 应用程序开始。我正在编写集成测试,并且需要对日志进行断言?
例如,我需要断言 Camel 路由从源 A 读取消息。如何对日志进行可靠断言?是否有任何行业标准?
注意:我尝试找到任何解决方案,但目前,我既不明白如何解决它,也找不到现成的解决方案。
更新 1:我低估的细节,但它似乎很重要。我用Kotlin,不是Java。我尝试应用answer,但它不能一对一地转移到Kotlin.
更新 2:
这是从Java到的转换Kotlin。ListAppender没有足够的信息来解析 中的类型Kotlin。
class LoggerExtension : BeforeEachCallback, AfterEachCallback {
private val listAppender: ListAppender<ILoggingEvent> = ListAppender<ILoggingEvent>()
private val logger: Logger = LoggerFactory.getLogger(ROOT_LOGGER_NAME) as Logger
override fun afterEach(extensionContext: ExtensionContext) {
listAppender.stop()
listAppender.list.clear()
logger.detachAppender(listAppender)
}
override fun beforeEach(extensionContext: ExtensionContext) {
logger.addAppender(listAppender)
listAppender.start()
}
val messages: List<String>
get() = …Run Code Online (Sandbox Code Playgroud) java ×4
junit ×3
mockito ×3
logging ×2
annotations ×1
assert ×1
final ×1
jmockit ×1
kotlin ×1
lombok ×1
powermock ×1
private ×1
reflection ×1
slf4j ×1
spring ×1
spring-boot ×1
static ×1
unit-testing ×1