2017-04-21 7 views
0

というラベルのと1つのxhtmlページというlabel.xhtmlと呼ばれるクラスのJSFプロジェクトがあります。 label.xhtmlでは、メソッドLabel.getValue()が注入によって呼び出されます。テストLabelTestは埋め込みコンテナを実行し、テストメソッドlabel.xhtmlが要求され、本文の内容がチェックされます。これまでのところすべて問題ありませんが、Label.valueの値を自分のテストで変更したいので、テストではクラスのラベルのPostconstruct-methodの値ではなく、自分の設定値をアサートできます。埋め込みオブジェクトを使用したJSFテスト:注入オブジェクトの操作

クラスのコンストラクタにブレークポイントを設定します。です。だから私はスタックトレースを見ることができ、私はこれらのメソッドの多くのコードを読んでいます。おそらくそれは私がそこに置くことができるので、生産クラスを変更することは可能ですAbstractProducer何らかの形でですか?

Stacktrace Label constructor

Code on GitHubまたはスクロールダウンします。注釈@Specializesを使用したりServletFilterを使用して:

import javax.annotation.PostConstruct; 
import javax.enterprise.context.RequestScoped; 
import javax.inject.Named; 

@Named 
@RequestScoped 
public class Label { 

    private String value; 

    public String getValue() { 
     return value; 
    } 
    public void setValue(String value) { 
     this.value = value; 
    } 
    @PostConstruct 
    public void fillValue() { 
     setValue("HELLO"); 
    } 
} 

import org.apache.tomee.embedded.EmbeddedTomEEContainer; 
import org.junit.After; 
import org.junit.Before; 
import org.junit.Test; 
import org.openqa.selenium.By; 
import org.openqa.selenium.WebDriver; 
import org.openqa.selenium.WebElement; 
import org.openqa.selenium.htmlunit.HtmlUnitDriver; 

import javax.ejb.embeddable.EJBContainer; 
import java.io.File; 
import java.util.HashMap; 
import java.util.Map; 
import static org.junit.Assert.assertEquals; 

public class LabelTest { 

    private WebDriver driver; 

    @Before 
    public void setup() { 
     driver = new HtmlUnitDriver(); 

     Map<Object, Object> properties = new HashMap(); 
     properties.put(EJBContainer.PROVIDER, EmbeddedTomEEContainer.class); 
     properties.put(EJBContainer.MODULES, new File[]{new File("src/main/webapp/")}); 
     properties.put(EJBContainer.APP_NAME, "hfe"); 
     System.setProperty("tomee.webapp.externalRepositories", "build/classes/main,build/classes/test"); 

     EmbeddedTomEEContainer.createEJBContainer(properties); 
    } 

    @After 
    public void cleanup() { 
     driver.close(); 
    } 

    @Test 
    public void requestHtmlPage_ThenBodyContainsPostConstructValue() { 
     assertEquals("HELLO", getBodyValue()); 
    } 

    @Test 
    public void manipulateInjectedObjectAndRequestHtmlPage_ThenBodyContainsValueOfManipulatedInjectedObject() { 
     // how is it possible to manipulate the injected object with value=MY_VALUE? 
     assertEquals("MY_VALUE", getBodyValue()); 
    } 

    private String getBodyValue() { 
     driver.get("http://localhost:8080/hfe/faces/label.xhtml"); 
     WebElement body = driver.findElement(By.tagName("body")); 
     return body.getText(); 
    } 

} 

label.xhtml

<html> 
<h:body> 
    #{label.value} 
</h:body> 
</html> 

答えて

0

私はTomEEユーザーメーリングリストからのソリューションを得ました。サンプルコードはGitHubプロジェクトで見つけることができます。