ElConditionEntity、 AlertTemplateEntity、およびAlertEntitiesAssertionsの3 つのクラスがあります。
AlertTemplateEntity は、データベース内のテーブルに対応します。ElConditionEntity は AlertTemplateEntity クラスの埋め込みファイルです。
AlertEntitiesAssertions は、テスト ケース クラスのオブジェクト インスタンスを設定するためのヘルパー クラスです。
Eclipseでテストケースを実行するたびに、例外なくテスト ケースに合格できます。
ただし、build.xml で始まるコマンド ラインでテスト ケースを実行すると、java.lang. ElConditionEntity クラスの setExpression メソッドによるNoSuchMethodError例外。さらに、エラースタックをトレースすると、setExpression メソッドの上に、プロジェクトで定義していないメソッドがいくつかあります。そして、それらのエラースタックには行番号がありません。
これが原因で失敗したテストケースがたくさんあります。
簡略化されたコードは次のとおりです。
@Entity
@Table(name="alert_templates")
public class AlertTemplateEntity {
@Column(name="type",nullable=false)
@Basic(optional=false)
private GgsObjectType objectType;
@Basic(optional=false)
private Severity severity;
private ELConditionEntity condition;
@OneToMany(cascade=CascadeType.ALL,mappedBy="alertTemplate")
private List<AlertEntity> alerts = new ArrayList<AlertEntity>();
@Basic(optional=false)
@Column(name="suppression_time")
private int suppressionTime;
@Column(name="message_template", length=4000)
private String messageTemplate;
..................
}
@Embeddable
public class ELConditionEntity {
@Basic(optional=false)
@Column(length=4000)
private String expression;
@Column(name="expression_template",length=4000)
private String template;
public String getExpression() {
return expression;
}
public String getStringTemplate() {
return template;
}
public void setExpression(String expression) {
this.expression = expression;
}
...........
}
public class AlertEntitiesAssertions{
public static final String EL_EXPRESSION = "${value==111}";
public static final String EL_STRING_TEMPLATE = "${value} == 111";
public static AlertTemplateEntity newTemplate(boolean withSubscription) {
final AlertTemplateEntity template = new AlertTemplateEntity();
template.setObjectType(TYPE);
template.setName(NAME);
template.setSeverity(SEVERITY);
template.setSuppressionTime(SUPPRESSION_TIME);
final ELConditionEntity condition = newCondition();
template.setCondition(condition);
..........................
}
public static ELConditionEntity newCondition() {
final ELConditionEntity condition = new ELConditionEntity();
condition.setExpression(EL_EXPRESSION);
condition.setStringTemplate(EL_STRING_TEMPLATE);
return condition;
}
}
エラー スタック:
[testng] FAILED: testSaveTemplateWithSubscription
[testng] java.lang.NoSuchMethodError: com.backend.jpa.model.alert.ELConditionEntity._persistence_propertyChange(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V
[testng] at com.backend.jpa.model.alert.ELConditionEntity._persistence_set_expression(ELConditionEntity.java)
[testng] at com.backend.jpa.model.alert.ELConditionEntity.setExpression(ELConditionEntity.java:45)
[testng] at com.backend.jpa.model.alert.AlertEntitiesAssertions.newCondition(AlertEntitiesAssertions.java:83)
[testng] at com.backend.jpa.model.alert.AlertEntitiesAssertions.newTemplate(AlertEntitiesAssertions.java:58)
[testng] at com.backend.jpa.model.alert.AlertEntitiesMappingTest.testSaveTemplateWithSubscription(AlertEntitiesMappingTest.java:106)
[testng] ... Removed 27 stack frames
アラート テーブルの構造:
CREATE TABLE alert_templates (
ID NUMBER(10) NOT NULL,
message_template LONG NULL,
SEVERITY NUMBER(10) NULL,
suppression_time NUMBER(10) NULL,
type NUMBER(10) NOT NULL,
NAME VARCHAR2(255) NULL UNIQUE,
expression_template CLOB NULL,
EXPRESSION CLOB NULL,
PRIMARY KEY (ID)
);