考虑以下使用 JSch 创建 SSH 连接的代码:
public class DoSsh {
private static final int DEFAULT_PORT = 22;
public DoSsh(String user, String pass) {
JSch jsch = new JSch();
Session sess = jsch.getSession(user, pass, DEFAULT_PORT);
...
以下使用 JMockit 的测试代码:
@Test
public void testDoShs() {
// Change the default port
Deencapsulation.setField(DoSsh.class, "DEFAULT_PORT", 2222);
DoSsh ssh = new DoSsh("me","mypass");
...
此处的目标是使 SSH 连接在测试期间使用备用端口(在本例中为 2222)连接到内存中的 SSH 服务器(Apache MIRA)。
当我调试这个时,我可以看到'DEFAULT_PORT'的值确实已经改变了(谢谢JMockit :-) 问题是编译器已经优化了对'jsch.getSession'的调用并硬编码了原始值22 进去。因此,当我在调试器中进入该调用时,即使传入的值为 2222,调用内部的值也是 22。
我的问题是,任何人都可以提出一种不涉及使 DEFAULT_PORT 非最终的解决方法吗?