【问题标题】:How to verify if method of interface is called如何验证接口的方法是否被调用
【发布时间】:2020-02-19 16:37:04
【问题描述】:

我想测试是否调用了接口中的方法。例如,我想验证在下面的代码中是否调用了“map.put(A,B)”。我将如何在 Junit 中执行此操作?我需要使用 Mockito 吗?


  public void funcName() {
    Map<String, Object> map = new HashMap<>();
    map.put("VALUE", new Object());
    ...
  }

【问题讨论】:

  • 理想的解决方案是 mockito。这里 powermock 也可以是一个解决方案。在这种情况下,您没有分离逻辑的关注点。这使得你的函数不容易测试。

标签: unit-testing testing junit mockito powermockito


【解决方案1】:

如果代码正是您发布的代码,那么 Mockito 就不够了:您需要 PowerMockito。

@RunWith(PowerMockRunner.class)
@PrepareForTest({MyClass.class})
public class MyTest{
    Map<String, Object> hashMap;

    @Before
    public void setUp() throws Exception {
        hashMap = Mockito.spy(new HashMap<>());
        PowerMockito.whenNew(HashMap.class).withAnyArguments().thenReturn((HashMap) hashMap);
    }

    /**
     * Test of doSomething method, of class MyMap.
     */
    @Test
    public void testDoSomething() {
        MyClass myClass = new MyClass();
        myClass.funcName();
        Mockito.verify(hashMap).put(Mockito.anyString(), Mockito.any());
    }
}

PowerMockito 的使用确实是必要的,当您遇到以下可测试性问题时:

  1. 私有方法
  2. 静态方法
  3. 最终或私人课程
  4. 构造函数

PowerMockito 绝不是干净 解决方案:is always better to avoid using it;此外,使用注射导致更好的设计。

有时甚至更少:如果您的代码是这样的:


public void funcName(Map<String, Object> map){
 // something here
  map.put("", obj);
 // other stuff
}

没有必要PowerMockito

public class MyTest{
    Map<String, Object> hashMap;

    @Before
    public void setUp() throws Exception {
        hashMap = Mockito.spy(new HashMap<>());
    }

    /**
     * Test of doSomething method, of class MyMap.
     */
    @Test
    public void testDoSomething() {
        MyClass myClass = new MyClass();
        myClass.funcName(hashMap);
        Mockito.verify(hashMap).put(Mockito.anyString(), Mockito.any());
    }
}

【讨论】:

    猜你喜欢
    • 2011-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-31
    • 1970-01-01
    相关资源
    最近更新 更多