mocikto模拟服务未返回true,始终返回false

时间:2018-09-01 19:49:18

标签: mocking mockito powermock

下面的代码(CallService.java)调用一个称为AService的服务,并进行一些更新,然后返回一个布尔值。

public boolean binSearch(int arr[],int low,int high,int val)
{
    if (low <= high) {
       int mid=(low+high)/2;
       if(arr[mid]==val) {
          return true;
       } else if(arr[mid]>val) {
          return binSearch(arr,mid+1,high,val);
       } else {
          return binSearch(arr,low+1,mid,val);
       }
    }
    return false;
}

下面的测试用例验证了CallService.java;已经模拟了所有与服务相关的类,并调用了我的被测类以调用AService并声明了布尔值,但是无论模拟如何,模拟总是返回false。

    public boolean getUpdateStatus() throws ServiceException {
    if (finder == null) {
        finderBean = new FinderBean();
    }
    myService = finderBean.find(AService.class);
    if (myService == null) {
        System.out.println("null >>>>>>>");
    }

    final Config config = new Config();
    final Update update = new Update();
    status = myService.update(update, config);
    System.out.println("Status: " + status);
    return status;
}

我在这里缺少任何指针吗?

谢谢。

1 个答案:

答案 0 :(得分:1)

根据documentation

  

所有用法都需要@RunWith(PowerMockRunner.class)@PrepareForTest 在课程级别上标注

     

使用PowerMockito.whenNew,例如

whenNew(MyClass.class).withNoArguments().thenThrow(new IOException("error message"));
     

请注意,您必须为创建MyClass的新实例(而不是MyClass本身)的类做准备。例如。如果将执行new MyClass()的类称为X,则必须执行@PrepareForTest(X.class)才能使whenNew起作用:

强调我的

因此,请确保您具有必要的属性,并相应地对依赖项进行了模拟

@RunWith(PowerMockRunner.class)
@PrepareForTest(CallService.class)
public class TestMyClass {
    FinderBean finderBean;
    AService myService;

    @Before
    public void setUp() throws Exception {        
        myService = PowerMockito.mock(AService.class);
        finderBean = PowerMockito.mock(FinderBean.class);
        PowerMockito.whenNew(FinderBean.class).withNoArguments().thenReturn(finderBean);            
    }

    @Test
    public void TestUpdateState() throws Exception {
        //Arrange                      
        PowerMockito.when(finderBean.find(AService.class)).thenReturn(myService);
        PowerMockito.when(myService.update(any(Update.class), any(Config.class))).thenReturn(true);
        CallService callService = new CallService(); 

        //Act
        final boolean status = callService.getUpdateStatus();

        //Assert
        assertTrue(status);
    }
}

它之前无法与您的模拟服务一起使用的原因是,测试中的参数与被测方法中的参数不同。被测试方法正在本地创建自己的实例,这意味着它们将与测试设置中使用的实例不同,因此在调用时不会表现出预期的行为。