在模拟 JAX-WS 代理上进行类播
我尝试在 Spring(3.2.2 版本)中使用 JaxWsPortProxyFactoryBean,但是当我尝试在我的单元测试中模拟端口时它失败了。 classcast 异常的原因是我需要将代理转换为 Bindingprovider。
我尝试添加 withSettings().extraInterfaces,但我得到了同样的异常。 https://groups.google.com/forum/?fromgroups=#!topic/mockito/YM5EF0x90_4
有没有人有任何建议来解决我的痛苦或以其他方式模拟端口?我添加 JaxWsPortProxyFactoryBean 的唯一原因是能够在不执行 WS 调用的情况下进行单元测试。
ApplicationContext-beans:
<bean id="port" class="org.mockito.Mockito" factory-method="mock" >
<constructor-arg index="0" value="name of the portType class" />
</bean>
WSHelper:
import com.sun.xml.ws.client.BindingProviderProperties;
import javax.xml.ws.BindingProvider;
@Resource
private ThePortTypeClass port;
…
BindingProvider bp = (BindingProvider) port;
...
投资组合实现:
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 接口(interface),因此它能够将代理转换为绑定(bind)提供程序。但是当我模拟对象时,它不再是实现 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));
}
关于java - mockito JAX-WS 代理中的 Classcastexception,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16560748/