Как получить доступ к частной карте в JUnit, используя отражения? - PullRequest
0 голосов
/ 15 ноября 2011

У меня есть класс соединителя (SVNConnector), который должен быть проверен на джунит. Существует частная карта с именем private Map<String, SVNRepository> connectionMap, к которой следует обращаться в JUnit, но у этой карты нет метода получения. Поэтому я должен использовать отражения, чтобы сделать это. Мой вопрос: как это работает? Я попробовал следующее:

@BeforeClass
public static void setUpBeforeClass() throws Exception {
    svnConnector = new SVNConnector(user, pwd);
    Field connectionMapField = SVNConnector.class.getDeclaredField("connectionMap");
    connectionMapField.setAccessible(true);
//AND NOW?
}

Не существует каких-либо специальных методов получения или установки коллекции, чтобы проверить размер коллекции collection или аналогичных. Так как я могу получить к нему доступ?

Спасибо.

Ответы [ 4 ]

2 голосов
/ 15 ноября 2011

Вы хотите сказать, что хотите получить значение поля?

Map<String, SVNRepository> connectionMap = 
    (Map<String, SVNRepository>) connectionMapField.get(svnConnector);
1 голос
/ 15 ноября 2011

Ознакомьтесь с аддонами JUnit.

В частности - http://junit -addons.sourceforge.net / junitx / util / PrivateAccessor.html

С главной страницейздесь - http://junit -addons.sourceforge.net /

Например:

PrivateAccessor.setField(myClassInstance, "privateMapName", myMap);
1 голос
/ 15 ноября 2011

Получите ссылку на поле (используя метод Field.get (Object )), приведите его к карте, а затем используйте.

Map connectionMap = (Map) connectionMapField.get(svnConnector);

int size = connectionMap.getSize();

Youможет также взглянуть на Учебник Java Reflection .

0 голосов
/ 17 ноября 2011

Если бы вам нравилось использовать дополнительные библиотеки (и процессоры аннотаций), вы могли бы использовать dp4j * @TestPrivate s аннотация:

    @TestPrivates
    @BeforeClass
public static void setUpBeforeClass() throws Exception {
    svnConnector = new SVNConnector(user, pwd);
    Map<String, SVNRepository> connectionMap = svnConnector.connectionMap; 
/* dp4j will replace this plain access the equivalent Reflection API code at compile-time */
    }

Вы также можете использовать -Averbose возможность увидеть сгенерированный код Reflection, скопировать и вставить его, а затем удалить @TestPrivates

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...