Лучшие практики для использования мерзавца с CVS

Я все для решения Eran Harel, и в тех случаях, когда это невозможно, предложение Томаша Нуркевича о шпионаже превосходно. Однако стоит отметить, что бывают ситуации, когда ни один из них не применим. Например. если метод login был бит «beefier»:

public class TestedClass {
    public LoginContext login(String user, String password) {
        LoginContext lc = new LoginContext("login", callbackHandler);
        lc.doThis();
        lc.doThat();
    }
}

... и это был старый код, который нельзя было реорганизовать, чтобы извлечь инициализацию нового LoginContext в его собственный метод и примените одно из вышеупомянутых решений.

Для полноты, стоит упомянуть третий метод - используя PowerMock , чтобы ввести макет объекта при вызове оператора new. Однако PowerMock не является серебряной пулей. Он работает, применяя манипуляции с байт-кодом в классах, которые он издевается, что может быть изворотливой практикой, если тестируемые классы используют манипуляцию или отражение кода байта и, по крайней мере, из моего личного опыта, как известно, приводят к результату, связанному с тестированием. Опять же, если других опций нет, единственная опция должна быть хорошей опцией:

@RunWith(PowerMockRunner.class)
@PrepareForTest(TestedClass.class)
public class TestedClassTest {

    @Test
    public void testLogin() {
        LoginContext lcMock = mock(LoginContext.class);
        whenNew(LoginContext.class).withArguments(anyString(), anyString()).thenReturn(lcMock);
        TestedClass tc = new TestedClass();
        tc.login ("something", "something else");
        // test the login's logic
    }
}

48
задан skiphoppy 25 March 2009 в 19:34
поделиться

4 ответа

Я описал ответ на подобный вопрос здесь .

Это работает удивительно хорошо, когда Вы вынуждены продолжить продвигать изменения в центральный репозиторий CVS.

21
ответ дан Community 7 November 2019 в 22:44
поделиться

Я только работал со взаимодействиями CVS мерзавца демонстрационному Мерзавцу для друга, но это было очень просто.

  • необходимо установить текущую копию cvsps . Git cvsimport использование это к истории CVS доступа.
  • Мы нашли, что, для крупного проекта, inital установка был очень быстрее путем делания полной копии CVS repo на компьютер и выполнения git cvsimport локально:

    $ rsync rsync://yourprojecthost.com/cvsroot/yourproject/*  
    $ mkdir myproject.git  
    $ cd myproject.git  
    $ git cvsimport -p -x -v -d :local:/path/to/cvsroot/yourproject 
    

Примечание, что-x после-p очень важен. Это передает-x cvsps. Для получения дополнительной информации посмотрите cvsps страница справочника .

11
ответ дан JonMR 7 November 2019 в 22:44
поделиться

Слегка мета-ответ. Если вы вынуждены использовать git «партизанский стиль», то есть ваша компания застряла в использовании cvs для контроля версий, а вы используете git на своей рабочей станции, чтобы облегчить жизнь, вы можете подумать о том, чтобы сделать что-то вроде этого:

CVS=realCvsPath
# commit to the git first
if ($ARGV[0] && $ARGV[0] eq "commit")
{
system 'git commit -a';
}

# execute the appropriate cvs program
# ===================================
exec "$CVS", @ARGV

Вызов этого файла «cvs» и включение его пути перед реальной командой CVS. В противном случае у вас могут быть коммиты git старше, чем коммиты cvs, что бесполезно ...

1
ответ дан 26 November 2019 в 19:04
поделиться

Я подробно описал свой собственный рабочий процесс для удаленной CVS, локального Git

8
ответ дан 26 November 2019 в 19:04
поделиться
Другие вопросы по тегам:

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