Mockito - Desired返回的模拟对象未被用于被测试类(CUT)

时间:2014-10-30 20:06:57

标签: java junit dependency-injection mockito

我正在尝试处理Mockito并且有一种情况我想在被测试类(CUT)中使用模拟对象,但它似乎不起作用。我很确定我正在接近解决方案。这是一些代码:

CUT:

public class TestClassFacade {

  // injected via Spring
  private InterfaceBP bpService;

  public void setBpService(InterfaceBP bpService) {

      this.bpService = bpService;
  }

  public TestVO getTestData(String testString) throws Exception {

    bpService = BPFactory.getSpecificBP();

    BPRequestVO bpRequestVO = new BPRequestVO();

    InterfaceBPServiceResponse serviceResponse = bpService.getProduct(bpRequestVO);

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

        throw new Exception();

    } else {

        TestVO testVO = new TestVO();
    }

    return testVO;
  }

}

Spring配置:

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

    String testString = "ThisIsATestString";
    BPRequestVO someBPRequestVO = new BPRequestVO();
    InterfaceBPServiceResponse invalidServiceResponse = new BPServiceResponse();

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

        invalidServiceResponse.setMessage("BOB");

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

        mockTestClassFacade.getTestData(testString);

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

我要做的是验证在第三方类的响应返回“BOB”消息字符串的情况下,调用CUT(抛出异常)的“if”条件部分(BPService)。但是,正在发生的事情是,当我在其下面的行中运行mockTestClassFacade时,我试图在上面的“when”语句中返回的“invalidResponse”对象实际上并未返回。相反,

InterfaceBPServiceResponse serviceResponse = bpService.getProduct(bpRequestVO);
正在调用实际方法中的

行,并且在我的测试中使用了“serviceResponse”。

在这种情况下,如何让mockTestClassFacade使用我的“invalidServiceResponse”?

非常感谢...如果有什么不清楚请告诉我!

2 个答案:

答案 0 :(得分:1)

我认为问题出在bpService = BPFactory.getSpecificBP();

您正在嘲笑并InterfaceBP注入TestClassFacade,但在方法getTestData内,您正在从InterfaceBP创建新的BPFactory

因此,在测试时,您实际上并没有使用模拟,而是使用不同的对象。

如果InterfaceBP由Spring创建并注入,则不需要工厂来获取实例。

答案 1 :(得分:1)

从另一个答案继续,你需要模仿&#34; BPFactory.getSpecificBP()&#34;的行为,但Mockito不会让你模拟静态方法。您必须使用PowerMock进行此测试。