「なんで?」
結局のところ、unitテストで実行しようとしたクラスにSystem.exit(int)があったのが原因だった。
それならば、System.exit(int)が効かなくなるおまじないはないかな?
と調べてみたら一応あった。
・テストクラス
public class Target { public static void main(String[] args) { if (args != null) { System.exit(0); } else { System.exit(-1); } } }・テストケース
import java.security.Permission; import junit.framework.TestCase; public class TargetTest extends TestCase { final SecurityManager sm = System.getSecurityManager(); protected void setUp() throws Exception { super.setUp(); // JVMを終了させない SecurityManager securityManager = new SecurityManager() { public void checkPermission(Permission permission) { if ("exitVM".equals(permission.getName())) { System.out.println("System.exit[exitVM]が呼ばれた"); } } public void checkExit(int status) { // super.checkExit(status); throw new ExitException(status); } }; System.setSecurityManager(securityManager); } protected void tearDown() throws Exception { System.setSecurityManager(sm); super.tearDown(); } protected class ExitException extends SecurityException { public int state = 0; public ExitException(int state) { this.state = state; } } public void test引数あり() { try { Target.main(new String[] {}); } catch (ExitException e) { assertEquals(0, e.state); } } public void test引数なし() { try { Target.main(null); } catch (ExitException e) { assertEquals(-1, e.state); } } }とりあえず、これでSystem.exit(int)を呼び出した場合に返されるintのassertも可能。
しかし、ある意味間違ってはないと思うんですが、
そもそも、FileとかSWTとかのからみでのポリシー設定でも何とかなるのかもしれない。。。
しかしながら、djUnitならこんなに悩まなくてもよかったのかもしれないが、
さすがに僕が勝手にライブラリーを増やすわけにはいかないので、
このやり方で当面はやりくりしてみよう。
0 件のコメント:
コメントを投稿