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 を非最終にすることを伴わないこれを解決する方法を提案できますか?