Я дразнил некоторые компоненты шва с помощью следующей подписи:
@Name("myService")
@Install(debug = true, precedence = Install.MOCK)
public class MyServiceMock implements MyService
Я включаю свои насмешки путем изменения этой строки в моем components.xml
к этому:
Это было прекрасно, когда я хотел дразнить все классы. У меня просто была своя замена скрипта Ant мой нормальный components.xml с отладочной версией.
Там какой-либо путь состоит в том, чтобы условно дразнить один или несколько компонентов? Идеальное решение позволило бы мне указывать который компоненты дразнить во внешнем файле, таком как components.properties или другой файл свойств.
Вот то, на чем я обосновался на основе ответа germanescobar.
Я изменил свои ложные подписи компонента для соответствия этому:
@Name("myService")
@Install(false)
public class MyServiceMock implements MyService
Затем я добавил строку для каждого компонента, который я хочу дразнить к components.xml, который похож на это:
Для включения насмешки я установил installed=true
.
Что я обычно делаю, когда хочу переопределить только определенные компоненты, так это использовать файл components.xml. Так, например, если у меня есть интерфейс MyService с такой реализацией по умолчанию, как эта:
@Name("myService")
public class DefaultMyService implements MyService
И я хочу переопределить только этот конкретный класс, я добавляю следующее в components.xml:
<component name="myService" class="org.gescobar.MockMyService" precedence="30" />
Просто взгляните на приоритет . По умолчанию каждый компонент имеет приоритет 20, поэтому значение 30 переопределит этот компонент. Вы можете думать о components.xml как о своем внешнем файле (или о application-context.xml для пользователей Spring), где вы можете переопределить любой компонент, который хотите.
Вы можете либо полагаться на org.jboss.seam.postInitialization Событие
Вызываемое, когда Seam инициализировал и запустил все компоненты
Или org.jboss.seam.postAuthenticate. <имя пользователя>
Вызывается после аутентификации пользователя, например devMode
Итак, создайте свой компонент ConditionallyEventComponent и определите его @Observer Event
@Name("conditionallyEventComponent")
@Scope(ScopeType.APPLICATION)
public class ConditionallyEvent {
@Observer("org.jboss.seam.postInitialization", create=true)
/*
* or @Observer("org.jboss.seam.postAuthenticate.devMode", create=true)
*/
public void postInitialization() {
/**
* An ideal solution would allow me to specify which components to mock out in an external file
*/
/**
* Here i am overriding ApplicationScoped components
*
* Maybe you want something like
* applicationContext.properties
* sessionContext.properties
*/
Context context = Contexts.getApplicationContext();
ResourceBundle resourceBundle = ResourceBundle.getBundle("applicationContext");
Enumeration<String> keyEnumeration = resourceBundle.getKeys();
while(keyEnumeration.hasMoreElements()) {
String key = keyEnumeration.nextElement();
/**
* Keep in mind newInstance method needs no-arg constructor
*/
context.set(key, Class.forName(resourceBundle.getString(key)).newInstance());
}
}
}
Поставив атрибут create, вы также можете указать, должен ли компонент-наблюдатель быть создан, если он не существует на момент возникновения события
Вы также можете поставить системное свойство следующим образом
-Dprofile=development
Посмотрите в документации вашего сервера приложений, как установить системное свойство. И внутри вашего события postInitialization (или postAuthenticate)
@Observer("org.jboss.seam.postInitialization", create=true)
public void postInitialization() {
Properties properties = System.getProperties();
String profile = properties.getProperty("profile");
if(profile != null && profile.equals("development")) {
// do as shown above
}
}