首页 > 解决方案 > JUnit 模拟方法调用

问题描述

我正在为methodA类“ classA”中的方法“”编写 Junit 测试。在 ' '类 ' methodA' 的另一个方法 ' ' 中被调用。' ' 调用肥皂网络服务。我想模拟这个肥皂网络服务调用。在这种情况下,我打电话。在这里,我没有找到一种方法,在调用时应该更新模拟值。我浏览了很多关于 的链接,但它们都指仅从类中更新模拟值。那么,我怎样才能通过嘲笑他们的价值。methodBclassBmethodBmethodBclassA.methodAclassB.methodBMockitojunit

@Test
public void junitTest() {
 String arg1 = "arg1";
 classA aObj = new classA();
 aObj.methodA(arg1);
}

public classA {
 public string methodA(String arg1) {
  classB bObj = new classB();
  bObj.methodB();
  //somwthing on arg1
  return result;
 }
}

public classB {
 public list methodB() {
  //web-service call
  return list from web - service.
 }
}

标签: junitmockito

解决方案


我正在为methodA课堂 上的方法编写 Junit 测试classA

由于您正在对 进行单元测试methodAclassA因此您应该专注于仅模拟bObj.methodB();调用。你不应该深入了解它在内部做什么或不做什么。

不是您正在创建不是理想场景的classB对象。methodA您应该使用适当的 getter、setter 和构造函数bObj作为实例变量。classA

然后从您的测试类中设置此classB依赖项。

你应该构建你的代码和一些像这样的测试:

class classAMicroTest {
    @Test
    public void junitTest() {
        String arg1 = "arg1";
        classA aObj = new classA();

        classB mockedBobj = Mockito.mock(classB.class);
        Mockito.when(mockedBobj.methodB()).thenReturn(new ArrayList<>());
        aObj.setbObj(mockedBobj);

        aObj.methodA(arg1);

        Mockito.verify(mockedBobj, times(1)).methodB());
    }

}

class classA {

    classB bObj;

    public void setbObj(classB bObj) {
        this.bObj = bObj;
    }

    public String methodA(String arg1) {
        bObj.methodB();
        // somwthing on arg1
        return result;
    }

}

class classB {

    public List<String> methodB() {
        return new ArrayList<>();
    }
}

推荐阅读