2

JAX-WS Web サービスとしていくつかの EJB があります。

@WebService
@Stateless
@Remote(MobileFacade.class)
public class MobileFacadeBean implements MobileFacade {
    ... 

   @Resource
   WebServiceContext wsc;

    ...
}

この Web サービス クラス内で、@Resource を介して WebServiceContext が注入されます。この WebServiceContext を使用して、実装でプリンシパルを取得します。これは非常にうまく機能しますが、このクラスを (ユニット) テストする方法が気になります!

これまで、OpenEJB を使用して EJB をテストしていました。Web サービス クラスもステートレス セッション Bean であるため、ここでも同じアプローチを使用したいと考えています。ただし、それほど簡単には機能しません。もちろん、Web サービスとして呼び出されない場合、WebServiceContext が存在しないと不平を言います。

最初の質問は、OpenEJB で WebServiceContext をモックする方法はありますか?

いいえの場合、この種の Web サービス クラスをテストするには、どのような方法をお勧めしますか?

乾杯、フランク

4

2 に答える 2

5

OpenEJBの例のzipファイルにはいくつかの@WebService単体テストの例があります。必要なものはすべて正常に機能するはずです。

webservice-securityの例は、あなたが望むものとまったく同じように聞こえます。オンラインのバージョンでは@RolesAllowed、コンテナにコードではなくセキュリティチェックを実行させるために使用されますが、コードで原則をチェックすることは可能です。これは、問題なく機能した、その例のわずかに変更されたバージョンです。

@DeclareRoles(value = {"Administrator"})
@Stateless
@WebService(
        portName = "CalculatorPort",
        serviceName = "CalculatorWsService",
        targetNamespace = "http://superbiz.org/wsdl",
        endpointInterface = "org.superbiz.calculator.CalculatorWs")
public class CalculatorImpl implements CalculatorWs, CalculatorRemote {

    @Resource
    private WebServiceContext webServiceContext;

    @RolesAllowed(value = {"Administrator"})
    public int sum(int add1, int add2) {
        // maybe log the principal or something -- prints "jane" in the test
        System.out.print(webServiceContext.getUserPrincipal());
        return add1 + add2;
    }

    @RolesAllowed(value = {"Administrator"})
    public int multiply(int mul1, int mul2) {
        return mul1 * mul2;
    }
}

テスト

public class CalculatorTest extends TestCase {

    private InitialContext initialContext;

    protected void setUp() throws Exception {
        Properties properties = new Properties();
        properties.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.apache.openejb.client.LocalInitialContextFactory");
        properties.setProperty("openejb.embedded.remotable", "true");

        initialContext = new InitialContext(properties);
    }

    /**
     * Create a webservice client using wsdl url
     *
     * @throws Exception
     */
    public void testCalculatorViaWsInterface() throws Exception {
        URL url = new URL("http://127.0.0.1:4204/CalculatorImpl?wsdl");
        QName calcServiceQName = new QName("http://superbiz.org/wsdl", "CalculatorWsService");
        Service calcService = Service.create(url, calcServiceQName);
        assertNotNull(calcService);

        CalculatorWs calc = calcService.getPort(CalculatorWs.class);
        ((BindingProvider) calc).getRequestContext().put(BindingProvider.USERNAME_PROPERTY, "jane");
        ((BindingProvider) calc).getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, "waterfall");
        assertEquals(10, calc.sum(4, 6));
        assertEquals(12, calc.multiply(3, 4));
    }
}

ライブラリ

Mavenを使用している場合は、通常のopenejb-core依存関係をopenejb-cxfそのように切り替えます。これにより、ApacheCXFとOpenEJB/CXF統合コードがクラスパスに追加されます。

<dependency>
  <groupId>org.apache.openejb</groupId>
  <artifactId>openejb-cxf</artifactId>
  <version>3.1.4</version>
  <scope>test</scope>
</dependency>

mavenを使用しない場合、最も簡単な方法はlib/、OpenEJBzipファイルのディレクトリからすべてのjarを追加することです。

于 2011-06-01T16:39:32.677 に答える
0

David、CalculatorTest での回答では、CalculatorWs.class を使用しました。Web サービス側の実装で使用されるのと同じインターフェイスですか。Web サービス クライアントを作成する必要がありますか?

また、Davidの例の代わりに


QName calcServiceQName = new QName("http://superbiz.org/wsdl", "CalculatorWsService");

使用する


QName calcServiceQName = new QName("http://superbiz.org/wsdl", "CalculatorPort");
于 2011-07-07T10:17:07.710 に答える