Mockito - thenReturn 总是返回空对象

新手上路,请多包涵

我正在尝试实现 Mockito 来测试特定方法,但是 .thenReturn(…) 似乎总是返回一个空对象,而不是我想要的:

切:

 public class TestClassFacade {

  // injected via Spring
  private InterfaceBP bpService;

  public void setBpService(InterfaceBP bpService) {

      this.bpService = bpService;
  }

  public TestVO getTestData(String testString) throws Exception {

    BPRequestVO bpRequestVO = new BPRequestVO();

    bpRequestVO.setGroupNumber(testString) ;
    bpRequestVO.setProductType("ALL") ;
    bpRequestVO.setProfileType("Required - TEST") ;

    IBPServiceResponse serviceResponse = bpService.getProduct(bpRequestVO);  //PROBLEM

    if (serviceResponse.getMessage().equalsIgnoreCase("BOB")) {

        throw new Exception();

    } else {

        TestVO testVO = new TestVO();
    }

    return testVO;
  }

}

弹簧配置:

 <bean id="testClass" class="com.foo.TestClassFacade">

   <property name="bpService" ref="bpService" />

</bean>

<bean id="bpService" class="class.cloud.BPService" />

Mockito 测试方法:

 @RunWith(MockitoJUnitRunner.class)
public class BaseTest {

    @Mock BPService mockBPService;
    @InjectMocks TestClassFacade mockTestClassFacade;

    private String testString = null;
    private BPRequestVO someBPRequestVO = new BPRequestVO();
    private IBPServiceResponse invalidServiceResponse = new BPServiceResponse();

    @Test (expected = Exception.class)
    public void getBPData_bobStatusCode_shouldThrowException() throws Exception {

        invalidServiceResponse.setMessage("BOB");

        someBPRequestVO.setGroupNumber(null);
        someBPRequestVO.setProductType("ALL");
        someBPRequestVO.setProfileType("Required - TEST");

        System.out.println("1: " + someBPRequestVO.getGroupNumber());
        System.out.println("2: " + someBPRequestVO.getProductType());
        System.out.println("3: " + someBPRequestVO.getProfileType());
        System.out.println("4: " + someBPRequestVO.getEffectiveDate());

        when(mockBPService.getProduct(someBPRequestVO)).thenReturn(invalidServiceResponse);

        mockTestClassFacade.getTestData(testString);

        verify(mockBPService).getProduct(someBPRequestVO);
    }
}

系统输出:

 1: null
2: ALL
3: Required - TEST
4: null

这里发生的事情是,当我运行测试时,serviceResponse 对象在上面标有 //PROBLEM 的 CUT 中的行中为 null。我的愿望是用我的测试方法中的“invalidServiceResponse”对象填充该对象。从我的 System.out.println 的输出来看,我的 bpRequestVO 在内容上与我的 someBPRequestVO 匹配。

有人可以告诉我我在这里缺少什么吗?

谢谢你的时间!

原文由 risingTide 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2k
2 个回答

与 --- 一起使用的 BPRequestVO 实例与 when() getTestData() 使用的实例不同。

除非您覆盖 equals() ,否则它们将不匹配。

如果覆盖 equals(),则不需要编写自定义匹配器。请注意 Mockito 文档 中的以下内容:

“自定义参数匹配器可以降低测试的可读性。有时最好为传递给模拟的参数实现 equals()(Mockito 自然使用 equals() 进行参数匹配)。这可以使测试更清晰。”

原文由 lewthor 发布,翻译遵循 CC BY-SA 3.0 许可协议

除了在 BPRequestVO 类中创建 equals 方法,您还可以使用“any(YourObject.class)”创建模拟参数,如下所示:

 when(mockBPService.getProduct(any(BPRequestVO.class))).thenReturn(invalidServiceResponse);

原文由 Victor Godoy 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题