モック JAX-WS プロキシのクラスキャスト
Spring (3.2.2 リリース) で JaxWsPortProxyFactoryBean を使用しようとしましたが、単体テストでポートをモックしようとすると失敗します。クラスキャスト例外の理由は、プロキシを Bindingprovider にキャストする必要があるためです。
withSettings().extraInterfaces を追加しようとしましたが、同じ例外が発生します。 https://groups.google.com/forum/?fromgroups=#!topic/mockito/YM5EF0x90_4
お尻の痛みを解決したり、他の方法でポートを嘲笑したりするための提案はありますか? JaxWsPortProxyFactoryBean を追加した唯一の理由は、WS 呼び出しを行わずに単体テストを実行できるようにするためでした。
ApplicationContext-Bean:
<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 インターフェースを実装しているため、プロキシを bindingprovider にキャストできます。しかし、オブジェクトをモックすると、BindingProvider を実装する型ではなくなります。