Я все для решения 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
}
}
Я описал ответ на подобный вопрос здесь .
Это работает удивительно хорошо, когда Вы вынуждены продолжить продвигать изменения в центральный репозиторий CVS.
Я только работал со взаимодействиями 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 страница справочника .
Слегка мета-ответ. Если вы вынуждены использовать 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, что бесполезно ...
Я подробно описал свой собственный рабочий процесс для удаленной CVS, локального Git