Тестируйте @Webservice EJBs с WebServiceContext (используя OpenEJB?) - PullRequest
2 голосов
/ 30 мая 2011

У меня есть несколько EJB-компонентов в качестве веб-службы JAX-WS:

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

   @Resource
   WebServiceContext wsc;

    ...
}

В этом классе веб-службы WebServiceContext внедряется через @Resource.Я использую этот WebServiceContext для получения принципала в реализации.Это работает довольно хорошо, но теперь мне интересно, как (Unit-) протестировать этот класс!

До сих пор я использовал OpenEJB для тестирования своих EJB.Поскольку класс веб-службы также является компонентом сеанса без сохранения состояния, мне бы очень хотелось использовать здесь тот же подход.Тем не менее, это не так просто - конечно, он жалуется на то, что WebServiceContext не вызывается, если он не вызывается как веб-служба.

Итак, первый вопрос: есть ли способы насмешки над WebServiceContext в OpenEJB?

А если нет, то какой подход вы бы предпочли для тестирования такого рода классов веб-служб?

Приветствия, Фрэнк

Ответы [ 2 ]

5 голосов
/ 01 июня 2011

В zip-файле примеров OpenEJB есть несколько примеров @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 следующим образом. Это добавит Apache CXF и код интеграции OpenEJB / CXF в ваш путь к классам.

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

Если не используется maven, самый простой подход - просто добавить все jar-файлы из каталога lib/ zip-файла OpenEJB.

0 голосов
/ 07 июля 2011

David, В своем ответе в CalculatorTest вы использовали CalculatorWs.class, это тот же интерфейс, который используется в реализации веб-сервиса.Нужно ли нам создавать клиента веб-службы?

Также в примере с Дэвидом Вместо


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

используйте


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