2017-05-12 4 views
0

JSF 2.2 애플리케이션에서 Selenium 테스트 용 war 파일을 빌드하려고합니다. webtest.war에서 NodeCache라는 중앙 클래스를 WebtestNodeCache라고하는 모의 버전으로 대체하여 데이터베이스 및 기타 외부 종속성을 테스트에서 제외 시키려고합니다.테스트 용 ServletContext 리스너가있는 JSF 업데이트 관리 빈

NodeCache가 관리 빈입니다 :

@javax.faces.bean.ManagedBean(name = NodeCache.INSTANCE) 
@javax.faces.bean.ApplicationScoped 
public class NodeCache { 
    public static final String INSTANE = "nodecache"; 
    // ... 
} 

이 WebtestNodeCache에 몰래, 나는이 같은 ServletContextListener 사용 : 정상에서

public class WebtestContextListener implements ServletContextListener { 
    @Override 
    public void contextInitialized(ServletContextEvent event) { 
     WebtestNodeCache nodeCache = new WebtestNodeCache(); 
     ServletContext context = event.getServletContext(); 
     context.setAttribute(NodeCache.INSTANCE, nodeCache); 
    } 

    @Override 
    public void contextDestroyed(ServletContextEvent sce) {} 
} 

, WebtestContextListener 및 WebtestNodeCache 전쟁 파일에서 제외됩니다 빌드를, 테스트 빌드에는 포함되어 있습니다.

이것이 작동하는 것 같습니다. 로그인 할 때 WebtestNodeCache에서 더미 노드를 얻습니다.

응용 프로그램 컨텍스트에서 빈을 대체 할 수있는 확실한 방법입니까, 아니면 운이 좋았습니까?

테스트 더미에서 몰래 들어가는 더 좋은 방법이 있습니까?

답변

0

@ManagedBean 주석과 리스너를 모두 사용하여 객체를 대체하지 못했습니다. 코드는 항상 잠금 해제 된 생산 코드 관리 빈을 사용했습니다.

@ManagedBean을 같은 이름으로 정의하면 오류가 발생하며 배포가 금지됩니다.

은 이걸로 끝났다 :

  • 진짜 콩과 모의 모두에서 같은 이름의 @ManagedBean 주석을 넣습니다.

  • 빌드 할 때 webtest.war을 빌드 할 때 mocks 만 포함하고 일반 빌드에는 빌드를 포함하지 마십시오.

  • 구축

    는, 빌드 스크립트 (내 경우에는 Gradle을)가 복사 및 생산 코드에 @ManagedBean 선언 뒤에 특별한 코멘트를 찾고 생산에 @ManagedBean 선언을 제거하려면 다음 행을 복용, 소스를 필터링 코드를 사용하여 모의 객체 중 하나만 남도록합니다.

    @javax.faces.bean.ManagedBean(name = NodeCache.INSTANCE) // webtest:remove 
    @javax.faces.bean.ApplicationScoped // webtest:remove 
    public class NodeCache { 
        public static final String INSTANE = "nodecache"; 
        // ... 
    } 
    

    과 조롱 버전은 주석없이, 같은 주석이 있습니다 :

그래서 원래 NodeCache는 이제 다음과 같습니다 여기

@javax.faces.bean.ManagedBean(name = NodeCache.INSTANCE) 
@javax.faces.bean.ApplicationScoped 
public class WebtestNodeCache extends NodeCache { 
    // ... 
} 

는 관련 부분입니다 Gradle 빌드 스크립트 :

boolean isWebtest = false 
gradle.taskGraph.whenReady { taskGraph -> 
    isWebtest = taskGraph.hasTask(compileWebtestWarJava); 
} 

task copySrc(type: Copy) { 
    from "src" 
    into "${buildDir}/src" 
    outputs.upToDateWhen { 
     // Always execute this task so that resources do or don't get filtered 
     // when switching between normal war file and webtests. 
     false 
    } 
    filter { String line -> 
     isWebtest && line.contains("webtest:remove") ? null : line; 
    } 
} 

이것은 나를 위해 문제를 해결합니다. 다른 사람이 유용하다고 생각하기를 바랍니다.