jmockit-издевательская цепочка методов, один из которых возвращает коллекцию с помощью @Cascading
Я пытаюсь издеваться над вызовом метода, который звучит примерно так:
rapContext.getSysInfo().get(key)
Метод getSysInfo () возвращает ConcurrentHashMap.
Вот что я сделал:
Class ABCTest {
@Cascading RapContext context;
@Test
doTest() {
new Expectations() {
{
rapContext.getSysInfo().get(anyString);
result = new UserPrefCtxObject();
}
}
}
С этим я получаю NullPointerException на rapContext.getSysInfo (). Вызов getSysInfo () возвращает значение null. Если я вызову любой другой метод, который не возвращает коллекцию, например rapContext.getDomain() все работает нормально.
Я не знаю, чего мне не хватает.Спасибо
1 ответ:
Пример кода не является полным, однако вы, вероятно, столкнетесь с некоторой проблемой, связанной с случайно издевательской картой. Если над картой (или любой частью фреймворка коллекции) издеваются, то многое ломается. Я не мог воспроизвести вашу проблему, так как любая попытка издеваться над RapContext с помощью @Cascading приводила к стеку над потоком.
Вместо этого вы можете частично имитировать RapContext, а затем либо вернуть реальную, либо поддельную карту. Когда я сталкиваюсь с подобными проблемами, я обычно их избегаю. используя @injectable для того чтобы только пробный экземпляр класса, или используя частичное издевается.
Вот подход, который позволит вам издеваться над getSysInfo:
public class RapContextTest { @Injectable ConcurrentHashMap<String, Object> mockedMap; @Test public void testContext() { RapContext context = new RapContext(); new MockUp<RapContext>(){ @Mock public ConcurrentHashMap getSysInfo(){ return mockedMap; } }; new NonStrictExpectations() { { mockedMap.get(anyString); result = "Success"; } }; Object value = context.getSysInfo().get("test"); System.out.println(value); } }