【问题标题】:Mockito when method call not invoked, Verify return message "Wanted but not invoked,Actually, there were zero interactions with this mock"未调用方法调用时的 Mockito,验证返回消息“想要但未调用,实际上,与此模拟的交互为零”
【发布时间】:2019-10-16 09:02:36
【问题描述】:

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



    }
}

【问题讨论】:

  • 看起来您正试图在您的方法中模拟 bb 对象。如果你想这样做,你将不得不使用 PowerMockitos whenNew 功能。但通常的建议是你重构你的类(如果你可以调整代码)。 -- 您当前创建的模拟与ClassA 无关。此外,您可能忘记为该对象添加变量名,并且您的示例缺少对 methodToTest 的调用。
  • 如果要模拟该字段,则应使用 ReflectionUtils.setField() 方法,因为 Mockito.when 在这种情况下不起作用。
  • 我已经用我错过的东西编辑了我的代码。我也尝试在 B 类对象上使用 PowerMockito.WhenNew 但我看到它进入了 B 类的方法而不是模拟它。跨度>

标签: mockito powermock


【解决方案1】:

我认为你把一些东西混在一起了。

使用重构版本,您需要将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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    • 2022-01-15
    相关资源
    最近更新 更多