首页 > 解决方案 > mockito-mocked 服务不返回 true,总是返回 false

问题描述

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

    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;
}

下面的测试用例验证了 CallService.java;已经模拟了所有与服务相关的类并调用我的测试类来调用 AService 并断言 bolean,但无论模拟如何,模拟总是返回 false。

@Before
public void setUp() throws Exception {

    myService = PowerMockito.mock(AService.class);
    finderBean = PowerMockito.mock(FinderBean.class);

    update = PowerMockito.mock(Update.class);
    config = PowerMockito.mock(Config.class);       
PowerMockito.whenNew(FinderBean.class).withNoArguments().thenReturn(finderBean);

PowerMockito.when(finderBean.find(AService.class)).thenReturn(myService);
}

@Test
public void TestUpdateState() throws Exception {

    callService = new CallService();
    MemberModifier.field(CallService.class, "finderBean").set(callService, finderBean);
    PowerMockito.when(finderBean.find(AService.class)).thenReturn(myService);
    PowerMockito.when(myService.update(update, config)).thenReturn(true);

    final boolean status = callService.getUpdateStatus();
    assertTrue(status);
}

我在这里遗漏了什么,有什么指示吗?

谢谢。

标签: mockingmockitopowermock

解决方案


根据文档

所有用法都需要在类级别@RunWith(PowerMockRunner.class)进行注释。@PrepareForTest

使用 PowerMockito.whenNew,例如

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

请注意,您必须准备创建MyClass用于测试的新实例的类,而不是其MyClass本身。例如,如果new MyClass()调用了类 doingX那么您必须这样做@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);
    }
}

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


推荐阅读