当未调用方法调用时,模拟,验证返回消息“希望但未调用,实际上,与该模拟的交互为零”

问题描述 投票:0回答:1

我是Mockito的新手。我有个问题。我正在尝试模拟一个类,并使用一个哈希表调用该类的方法,该哈希表返回修改后的相同哈希表。但是我看到没有调用模拟方法。如果我确实确认我收到的消息是“想要但未调用,实际上,此模拟的交互为零”

这是我的代码要测试的课程

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



    }
}
mockito powermock
1个回答
0
投票

我认为您将几件事混合在一起。

使用重构版,您需要将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);
}
© www.soinside.com 2019 - 2024. All rights reserved.