我正试图获得Mockito的句柄,但遇到了这样的情况:我想使用测试类(CUT)中的mock对象,但它似乎不起作用。我很确定我对解决方案的处理是错误的。这里有一些代码:
切割:
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;
}
}
弹簧配置:
<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));
}
}
我试图做的是验证在从第三方类(BPService)的响应返回"BOB"消息字符串的情况下,CUT的"if"条件部分(抛出异常)是否被调用。然而,当我在上面的"when"语句中运行mockTestClassFacade时,我试图返回的"invalidResponse"对象实际上并没有返回
InterfaceBPServiceResponse serviceResponse = bpService.getProduct(bpRequestVO);
实际方法中的行正在被调用,并且在我的测试过程中使用了"serviceResponse"。
在这种情况下,我如何让我的mockTestClassFacade使用我的"invalidServiceResponse"
非常感谢。。。如果有什么不清楚的地方,请告诉我!
我认为问题出在bpService = BPFactory.getSpecificBP();
中。
您正在嘲笑InterfaceBP
并将其注入到TestClassFacade
中,但在方法getTestData
中,您正在从BPFactory
创建一个新的InterfaceBP
。
因此,在测试时,您实际上并没有使用mock,而是使用不同的对象。
如果InterfaceBP
是由Spring创建和注入的,则不需要工厂来获取实例。
从另一个答案继续,您需要模拟"BPFactory.getSpecificBP()"的行为,但Mockito不允许您模拟静态方法。您必须使用PowerMock进行此测试。