Java: Как к методам тестирования, которые называют System.exit ()?

В дополнение к большой части того, что сказали другие плакаты, мне действительно нравится ступать через одну строку за один раз наряду с компьютером, поскольку это вынуждает меня думать об одной строке за один раз. Часто я буду ловить ошибку, даже не смотря на значения переменных просто, потому что я вынужден посмотреть на нее, поскольку я нажимаю кнопку 'следующей строки'. Однако я не думаю, что мой ответ поможет Вам, счету, потому что у Вас, вероятно, уже есть этот навык.

До изучения ресурсов идут, я не использовал никого - я просто исследую все меню и опции.

187
задан EricSchaefer 21 November 2008 в 07:02
поделиться

3 ответа

На самом деле вы можете имитировать или исключить метод System.exit в тесте JUnit.

Например, используя JMockit вы можете написать (есть и другие способы):

@Test
public void mockSystemExit(@Mocked("exit") System mockSystem)
{
    // Called by code under test:
    System.exit(); // will not exit the program
}


EDIT: альтернативный тест (с использованием последней версии JMockit API), который не позволяет запускать какой-либо код после вызова System.exit (n) :

@Test(expected = EOFException.class)
public void checkingForSystemExitWhileNotAllowingCodeToContinueToRun() {
    new Expectations(System.class) {{ System.exit(anyInt); result = new EOFException(); }};

    // From the code under test:
    System.exit(1);
    System.out.println("This will never run (and not exit either)");
}
31
ответ дан 23 November 2019 в 05:46
поделиться

Для ответа VONC запустится на Junit 4, я изменял код следующим образом

protected static class ExitException extends SecurityException {
    private static final long serialVersionUID = -1982617086752946683L;
    public final int status;

    public ExitException(int status) {
        super("There is no escape!");
        this.status = status;
    }
}

private static class NoExitSecurityManager extends SecurityManager {
    @Override
    public void checkPermission(Permission perm) {
        // allow anything.
    }

    @Override
    public void checkPermission(Permission perm, Object context) {
        // allow anything.
    }

    @Override
    public void checkExit(int status) {
        super.checkExit(status);
        throw new ExitException(status);
    }
}

private SecurityManager securityManager;

@Before
public void setUp() {
    securityManager = System.getSecurityManager();
    System.setSecurityManager(new NoExitSecurityManager());
}

@After
public void tearDown() {
    System.setSecurityManager(securityManager);
}
3
ответ дан 23 November 2019 в 05:46
поделиться

Есть среды, в которых возвращаемый код выхода используется вызывающей программой (например, ERRORLEVEL в MS Batch). У нас есть тесты для основных методов, которые делают это в нашем коде, и наш подход заключался в использовании аналогичного переопределения SecurityManager, которое используется в других тестах здесь.

Вчера вечером я собрал небольшой JAR, используя аннотации Junit @Rule, чтобы скрыть код диспетчера безопасности, а также добавить ожидания на основе ожидаемого кода возврата. http://code.google.com/p/junitsystemrules/

2
ответ дан 23 November 2019 в 05:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: