Как проверить исполняемый JAR? - PullRequest
1 голос
/ 19 декабря 2010

У меня есть простой класс в исполняемом файле JAR:

public final class Main {
  public static void main(String[] args) {
    System.out.println("hello, world!");
    System.exit(-1);
  }
}

Теперь я пытаюсь проверить этот класс / метод:

public class MainTest {
  @Test public void testMain() {
    Main.main(new String[] { "something" });
  }
}

Тестирование дает сбой на System.exit(0), и я могу понять, почему. Что мне теперь делать? Должен ли я издеваться System? Какой здесь стандартный подход? Кстати, может быть, я должен проверить метод "в контейнере" (читать "в JAR"), так же, как мы делаем это с файлами WAR?

Ответы [ 3 ]

1 голос
/ 19 декабря 2010

Использование AspectJ вокруг рекомендации может сработать здесь, так как вы сможете перехватить вызов на System.exit.

1 голос
/ 19 декабря 2010

Используйте полицию безопасности или Диспетчер безопасности, который не позволяет завершить работу виртуальной машины exit.

    System.setSecurityManager(new SecurityManager() {
        @Override
        public void checkExit(int status) {
            throw new AccessControlException("exit not allowed during testing");
        }
    });

Возможным недостатком является то, что вызов exit вызовет исключение,

См. java.lang.SecurityManager и Разрешения вJDK для деталей.

( Мне не нравится идея вызова exit - своего рода грубый способ остановить виртуальную машину. )

0 голосов
/ 19 декабря 2010

Ваш главный не должен вызывать System.exit (0);если этого не произойдет, это не будет иметь никакого значения, за исключением того, что вы можете вызвать его в тесте.

Или вы не должны тестировать основное, поскольку вы на самом деле ничего не проверяете.

РЕДАКТИРОВАТЬ: В прошлом я шел с предложением использовать SecurityManager для предотвращения System.exit () выключения модульного теста.Однако за последние несколько лет я просто позаботился о том, чтобы не использовать System.exit () по многим причинам, включая эту.

...