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 3

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);

    }
}