Mockito, когда вызов метода не вызывается, Verify return message "Требуется, но не вызывается. На самом деле, с этим макетом не было никаких взаимодействий" - PullRequest
0 голосов
/ 16 октября 2019

Я новичок в Мокито. У меня проблема. Я пытаюсь смоделировать класс и вызвать метод этого класса с hashmap, который возвращает тот же измененный hashmap. Но я вижу, что издевательский метод не вызывается. Если я проверял, я получил сообщение «Требуется, но не вызывается, На самом деле, с этим макетом не было никаких взаимодействий»

Вот мой код Класс для проверки

public class ClassA{
    private ClassB bb = new ClassB();

    public boolean init() {

        bb= new ClassB();
        bb.init();

        return true;
}

    public void methodToTest(){    
        Map<String, Map<String, Integer>> hashmap= new LinkedHashMap<>();

        hashmap = bb.method1(hashmap);
    }

    public ClassB getBB() {
       return bb;
    }

    public void setBB(ClassB bb) {
       this.bb= bb;
    }
}

Мой тестовый класс

@RunWith(PowerMockRunner.class)
public class TestClassA {       

    @Test
    @PrepareForTest({Utilities.class, Logger.class, LoggerFactory.class})
    public void getData() throws JsonProcessingException, JSONException {


        Map<String, Map<String, Integer>> hashmap= new LinkedHashMap<>();
        Map<String, Map<String, Integer>> newHashmap= new LinkedHashMap<>();

        ClassA class2Test= new ClassA ();
        ClassB mockClassB= Mockito.mock(ClassB.class);



PowerMockito.whenNew(ClassB.class).withAnyArguments().thenReturn(mockClassB);
        Mockito.when(mockClassB.method1(hashmap)).thenReturn(newHashmap);
        Mockito.verify(mockClassB).method1(hashmap);

        class2Test.methodToTest();



    }
}

1 Ответ

0 голосов
/ 17 октября 2019

Я думаю, что вы смешали несколько вещей вместе.

В реорганизованной версии вам нужно ввести макет для ClassB в ClassA (не нужно использовать PowerMockito.whenNew).

Также обратите внимание, что вызов verifiy должен быть после вызова метода теста.

@RunWith(PowerMockRunner.class)
public class SampleTest {

    static class ClassB {
        public Map<String, Map<String, Integer>> method1(Map<String, Map<String, Integer>> hashmap) {
            return null;
        }
    }

    static class ClassA {

        private ClassB bb = new ClassB();

        public void methodToTest() {

            Map<String, Map<String, Integer>> hashmap = new LinkedHashMap<>();
            hashmap = bb.method1(hashmap);
        }
    }

    @Mock
    ClassB bb;

    @InjectMocks
    ClassA class2Test;

    @Test
    public void test() throws Exception {

        Map<String, Map<String, Integer>> hashmap = new LinkedHashMap<>();
        Map<String, Map<String, Integer>> newHashmap = new LinkedHashMap<>();

        Mockito.when(bb.method1(hashmap)).thenReturn(newHashmap);
        class2Test.methodToTest();

        Mockito.verify(bb).method1(hashmap);
    }
}

Для вашего старого кода тест будет выглядеть примерно так, но если вы можете использовать версиювыше.

@PrepareForTest должен содержать класс, в котором следует манипулировать байтовым кодом, в данном случае ClassA.

@Test
@PrepareForTest(ClassA.class)
public void test() throws Exception {

    Map<String, Map<String, Integer>> hashmap = new LinkedHashMap<>();
    Map<String, Map<String, Integer>> newHashmap = new LinkedHashMap<>();

    ClassB bb = Mockito.mock(ClassB.class);
    Mockito.when(bb.method1(hashmap)).thenReturn(newHashmap);

    PowerMockito.whenNew(ClassB.class).withAnyArguments().thenReturn(bb);

    ClassA class2Test = new ClassA();
    class2Test.methodToTest();

    Mockito.verify(bb).method1(hashmap);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...