JUnit模拟方法调用

时间:2018-04-26 15:11:57

标签: junit mockito

我正在为方法' methodA'编写Junit测试。这是在班级' classA'。在' methodA'另一种方法' methodB'课程' classB'叫做。 ' methodB'叫肥皂网络服务。我想模仿这个methodB肥皂网络服务电话。在这种情况下,我正在呼叫classA.methodA。在这里,我找不到一种方式,当classB.methodB被调用时,模拟值应该更新。我浏览了许多关于Mockito的链接,但他们都提到仅更新junit类的模拟值。那么,我怎样才能通过模拟价值他们的。

@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.
 }
}

1 个答案:

答案 0 :(得分:0)

  

我正在为类中的方法methodA编写Junit测试   classA

由于您是methodA classA的单元测试,因此您应该专注于模拟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<>();
    }
}