JVM HotSwappingを利用する別の方法があります。
コードを一部のサーバーに配備しているとします。次に、アプリケーションを起動するときに、リモートデバッグをオンにすることを確認してください(デバッグしているので、展開について話していると思います)。それ以外の場合は、ローカルデバッガで正常に動作します。
ここでは、メインとその他の2つのクラスがあります。
package com.stackoverflow;
import java.io.File;
import java.io.IOException;
public class Other {
public static void otherStuff() throws IOException {
File file = new File("Some_File.txt");
file.createNewFile();
}
}
throwException()
package com.stackoverflow;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
doStuff();
}
private static void doStuff() throws IOException {
System.out.println("doStuff");
Other.otherStuff();
}
public static void throwException() throws IOException {
throw new IOException();
}
}
は、例えば、いくつかのutilのクラスでは、限り、それは "グローバル" 利用可能になるとどこにでも配置することができます。今は便宜のためにMainクラスに配置されています。
doStuff()
メソッドでブレークポイントを設定することができます。そこで、固定throwException()
メソッドを呼び出すようにotherStuff()
メソッドのコードを変更することができます。
public static void otherStuff() throws IOException {
Main.throwException();
File file = new File("Some_File.txt");
file.createNewFile();
}
私たちは、そうでない場合、我々はUnreachable statement
との誤差がありますので、いくつかの方法の代わりに、throw new IOException()
を呼び出すを呼び出す必要があります。
その後、我々は他のクラスを再コンパイルするはCtrl +Shiftキー + F9を押すことができます。これでHotSwappedになります(実際にこれを行うかどうかを確認するダイアログが表示されます)。
次に、[続行]を押すと、例外がスローされます。
コードを元の状態に戻すことができます。
これは良いことは、再コンパイルされたクラスがリモートマシンに "ワイヤーで"ホットスワップされることです。
重要なことは、再コンパイルするコードが別のクラスにあることです。ブレークポイントを持っているクラスと同じクラスは、正しく読み込まれません。
回避策として、例外をスローして再デプロイするようにコードを変更できます。しかし、私はソースコードを変更せずにデバッガでこれを行う方法があるのだろうかと思います。
コードを修正しますが、デバッガではその時点で修正します。その後、小さな変更を元に戻して再コンパイルして、古いコードをホットスワップバックすることができます。
私はあなたがアイデアを得ることを望みます。
必要に応じてスクリーンショットを追加できます。
可能です。私は、この種のテストをより容易にする別の設計を検討することをお勧めします。例えば、[依存性注入](http://en.wikipedia.org/wiki/Dependency_injection)。 –
@RobI依存性注入が良いです。私はそれが私にどのように役立つのか分かりません。あなたは精緻化できますか? –
短いアイデア:時には例外を発生させるコードブロック(たとえば、 'do()'メソッドで 'IODoer'と言っていることをやるためのインターフェースを作ってください。あなたの本当の実装は全ての実際のコードを持つ一つの具象クラス 'IODoerImpl'にありますが、' do() 'メソッドを呼び出すたびに例外を発生させる別の具体的なクラス' TestIODoer'を持っています。いつも...あなたのプログラムは実際の実装を使用しますが、テスト中に代わりにこのテストクラスを注入することができます。 –