2016-11-22 3 views
0

Сейчас я занимаюсь разработкой основ тестирования для небольшой компании, и эта проблема:Junit. Несколько поведения тесты без кода дублировать

Услуг могут общаются с Афоризмом по:

  1. с прямыми запросами (услугой < -> обслуживание).
  2. Через общие шлюзы (сервис < -> шлюз < -> сервис).

У меня есть некоторые тесты, которые охватывают только первый вариант.

И что я хочу - это как-то обложка второй вариант без копии & вставка кода от первого. Все различия будут только на первых шагах (установление соединения). Я попытался использовать параметризацию, но, кажется, это не то, что мне нужно.

UPD:

пример кода для первого варианта: например

Clients clients = new Clients( configLoader.getProperty("env.servicename.host"), Integer.parseInt(configLoader.getProperty("env.servicename.port")));

код для второго варианта:

Clients clients = new Clients( configLoader.getProperty("env.gateway.host"), Integer.parseInt(configLoader.getProperty("env.gateway.port")), configLoader.getProperty("env.gateway.user"), configLoader.getProperty("env.gateway.password"));

+0

[Burst] (https://github.com/square/burst) предоставляет параметризацию с использованием перечислений. Каждое перечисление может представлять собой различную реализацию интерфейса, который вы определяете, и, следовательно, обеспечивать различное поведение. Будет ли это полезно? Если нет, можете быть более конкретным? – aha

ответ

0

Как я уже упоминал в своем комментарии, кажется, что Burst может соответствовать вашим потребностям.

Во-первых, вы, чтобы определить перечисление с поведением спараметрировать, что-то вдоль линий этого:

enum CommunicationStyle { 
    DIRECT() { 
     @Override 
     public Clients clients(Object configLoader) { 
      return new Clients(configLoader.getProperty("someprop")); 
     } 
    }, 
    SERVICE() { 
     @Override 
     public Clients clients(Object configLoader) { 
      return new Clients(configLoader.getProperty("otherprop")); 
     } 
    }; 

    public abstract Clients clients(); 
} 

В своих тестах вы указываете перечисление CommunicationStyle в качестве аргумента. Это дает команду Burst выполнить тест один раз для каждого элемента перечисления. В этом случае каждый тест будет выполняться дважды, один раз с CommunicationStyle.DIRECT и один раз с CommunicationStyle.SERVICE.

@RunWith(BurstJUnit4.class) 
public class SomeParameterizedTest { 

    @Test 
    public void someTest(CommunicationStyle style) throws Exception { 
     Object configLoader = ... 
     Clients = style.clients(configLoader); 

     // more logic 
    } 
} 

Затем вы можете использовать значение перечисления для получения вашего параметризованного поведения, например. специально созданный экземпляр Clients.

+0

спасибо, что именно то, что мне нужно – myTalala

0

мне нужно бы некоторые примеры кода, чтобы дать вам больше подробности, но идея здесь в том, что вы программируете против интерфейсов, тогда вам не понадобится дублировать код.

Скажите, что ваша Служба и ваши компоненты шлюза реализуют один и тот же интерфейс. Вы можете использовать две различные реализации в своем тесте, не требуя изменения кода. То есть, если результат все равно будет таким же.

Другой вариант - написать небольшой класс адаптера, который вы можете протестировать, либо вызывающий компонент Service, либо Gateway. Если реализация для вызова двух разных компонентов сильно отличается, то (опять же) вы можете создать интерфейс, реализуемый двумя реализациями адаптера. Держите ваши тесты красивыми и чистыми.

Надеюсь, что это дает некоторое представление о том, как вы можете думать об этих вещах.

+0

добавлен простой пример кода все следующие коды будут одинаковыми – myTalala

+0

Является ли класс клиентов классом, который вы хотите проверить, или точкой входа для всего, что вы хотите проверить? Код, который вы указали в своем модульном тесте? или в коде, который вы хотите проверить? –

+0

Junit код Clien класс пример. На практике это всего лишь два разных способа создания сеанса – myTalala