我在我的类中使用私有静态最终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) 具体来说,我正在尝试为一个方法创建单元测试,该方法需要用于File.separatorChar在windows和unix上构建路径.代码必须在两个平台上运行,但当我尝试更改此静态最终字段时,我会收到JUnit错误.
任何人都知道发生了什么事吗?
Field field = java.io.File.class.getDeclaredField( "separatorChar" );
field.setAccessible(true);
field.setChar(java.io.File.class,'/');
Run Code Online (Sandbox Code Playgroud)
当我这样做时,我明白了
IllegalAccessException: Can not set static final char field java.io.File.separatorChar to java.lang.Character
Run Code Online (Sandbox Code Playgroud)
思考?
在java中,说我有以下内容
==fileA.java==
class A
{
public static final int SIZE = 100;
}
Run Code Online (Sandbox Code Playgroud)
然后在另一个文件中我使用此值
==fileB.java==
import A;
class b
{
Object[] temp = new Object[A.SIZE];
}
Run Code Online (Sandbox Code Playgroud)
当这个被编译时会SIZE被替换为值100,所以如果我要在路上替换FileA.jar而不是FileB.jar,对象数组将获得新值或者它是否已被硬编码为100,因为那是它最初建成时的价值?
谢谢,
斯蒂芬妮
我的目标是用Mockito模拟Build.Version.SDK_INT.已经尝试过:
final Build.VERSION buildVersion = Mockito.mock(Build.VERSION.class);
doReturn(buildVersion.getClass()).when(buildVersion).getClass();
doReturn(16).when(buildVersion.SDK_INT);
Run Code Online (Sandbox Code Playgroud)
问题是:当mock需要方法时,而.SDK_INT不是方法.
java ×3
mockito ×2
android ×1
compilation ×1
file-io ×1
final ×1
jmockit ×1
junit ×1
mocking ×1
reflection ×1
static ×1
testing ×1
unit-testing ×1