Java 模拟JAX-WS代理时发生Classcast异常
模拟JAX-WS代理上的Classcast 我尝试在Spring(3.2.2版本)中使用JaxWsPortProxyFactoryBean,但在单元测试中尝试模拟端口时失败。classcast异常的原因是我需要将代理强制转换为Bindingprovider 我试图添加withSettings().extraInterfaces,但得到了相同的异常。 有没有人有任何建议来解决我的痛苦,或者以其他方式嘲笑港口?我添加JaxWsPortProxyFactoryBean的唯一原因是能够在不进行WS调用的情况下进行单元测试 ApplicationContext bean:Java 模拟JAX-WS代理时发生Classcast异常,java,spring,mocking,jax-ws,mockito,Java,Spring,Mocking,Jax Ws,Mockito,模拟JAX-WS代理上的Classcast 我尝试在Spring(3.2.2版本)中使用JaxWsPortProxyFactoryBean,但在单元测试中尝试模拟端口时失败。classcast异常的原因是我需要将代理强制转换为Bindingprovider 我试图添加withSettings().extraInterfaces,但得到了相同的异常。 有没有人有任何建议来解决我的痛苦,或者以其他方式嘲笑港口?我添加JaxWsPortProxyFactoryBean的唯一原因是能够在不进行WS调用
<bean id="port" class="org.mockito.Mockito" factory-method="mock" >
<constructor-arg index="0" value="name of the portType class" />
</bean>
Portfolioimpl:
REQUEST request= RequestHelper.getRequest(vo);
ThePortTypeClass port =wSHelper.getPort();
RESPONSE response = null;
response = port.wSMethod(request);
单元测试:
import static org.mockito.Mockito.*;
import static org.junit.Assert.*;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"/applicationContext.xml"})
public class PortfolieTest {
@Resource
private ThePortTypeClass port;
@Resource
private WSHelper wsHelper;
@Autowired
Portfolio portfolio;
@Before
public void setup(){
RESPONSE response = new RESPONSE();
…
port=mock(ThePortTypeClass.class, withSettings().extraInterfaces(BindingProvider.class));
when(port.method(any(REQUEST.class))).thenReturn(response);
}
@Test
public void update() {
assertEquals(true, portfolio.update(someParameters));
}
}
更新:
我认为问题不在于Bindingprovider的不同版本。
当我对代理bean进行以下更改时,它能够执行强制转换并执行ws调用
<bean id="port" class="org.springframework.remoting.jaxws.JaxWsPortProxyFactoryBean">
<property name="serviceInterface" value="ThePortTypeClass" />
<property name="namespaceUri" value="nm" />
<property name="serviceName" value="theServicename" />
<property name="endpointAddress" value="theUrl" />
<property name="wsdlDocumentUrl" value="theUrl" />
</bean>
JaxWsPortProxyFactoryBean确实实现了Bindingprovider接口,因此它能够将代理强制转换为Bindingprovider。但当我模拟对象时,它不再是实现BindingProvider的类型 经过一些研究,我发现我的单元测试更像是一个集成测试 将测试更改为以下内容以使其正常工作:
@RunWith(MockitoJUnitRunner.class)
public class PortfolieTest {
@InjectMocks
Portfolio portfolio = new PortfolioImpl();
@Mock
private thePortType port;
@Mock
private WSHelper wsHelper = new WSHelper();
@Before
public void setup() throws Feil, MalformedURLException, DocumentException {
RESPONSE response = new RESPONSE();
…
when(wsHelper.gePort(someParameters).thenReturn(port);
when(port.wsmethod(any(REQUEST.class))).thenReturn(response);
}
@Test
public void update() throws MalformedURLException, DocumentException {
assertEquals(true, portfolio.update(someParameters));
}
以下是我尝试和工作的内容
public interface AbstractPZGetEmployeeDataV3 extends PZGetEmployeeDataV3Port, BindingProvider {
}
@Spy
AbstractPZGetEmployeeDataV3 spyPort;
Mockito.lenient().when(pZGetEmployeeDataV3_Service.getPZGetEmployeeDataV3SOAPAPIGEEDEV()).thenReturn(spyPort);
GetAllGenericEmployeeDataResponse soapResp = new GetAllGenericEmployeeDataResponse();
soapResp.setEmploymentStatusCode("S");
soapResp.setLastName("LastNAme");
Mockito.lenient().when(spyPort.getAllGenericEmployeeData(Mockito.any())).thenReturn(soapResp);
BindingProvider与类加载器看到的是同一个BindingProvider吗?换句话说,您的JVM中是否有两个BidingProvider副本
Mockito.lenient().when(pZGetEmployeeDataV3_Service.getPZGetEmployeeDataV3SOAPAPIGEEDEV()).thenReturn(spyPort);
GetAllGenericEmployeeDataResponse soapResp = new GetAllGenericEmployeeDataResponse();
soapResp.setEmploymentStatusCode("S");
soapResp.setLastName("LastNAme");
Mockito.lenient().when(spyPort.getAllGenericEmployeeData(Mockito.any())).thenReturn(soapResp);