我正在尝试处理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”?
非常感谢...如果有什么不清楚请告诉我!
答案 0 :(得分:1)
我认为问题出在bpService = BPFactory.getSpecificBP();
。
您正在嘲笑并InterfaceBP
注入TestClassFacade
,但在方法getTestData
内,您正在从InterfaceBP
创建新的BPFactory
。
因此,在测试时,您实际上并没有使用模拟,而是使用不同的对象。
如果InterfaceBP
由Spring创建并注入,则不需要工厂来获取实例。
答案 1 :(得分:1)
从另一个答案继续,你需要模仿&#34; BPFactory.getSpecificBP()&#34;的行为,但Mockito不会让你模拟静态方法。您必须使用PowerMock进行此测试。