1

봄 특수 효과를 사용하여 속성을 설정하는 방법을 파악하는 데 어려움이 있습니다.Spring은 런타임 객체를 사용하여 속성을 설정합니까?

나는 추상적 인 기본 클래스를 가지고 있습니다.

abstract class AbstractTest{ 
private static Session session; 

@BeforeClass 
public static void initApplication() throws Exception { 
    session = new Session(); 
    ... 
} 

public Session getSession(){ 

내 AbstractTest를 확장하는 테스트 클래스가 있습니다.

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration 
public class RealTest extends AbstractTest{ 

@Autowired 
Service service; 

세션 개체를 사용해야하는 서비스가 있고 세션 개체에 "자동 설정"하고 싶습니다.

public class ServiceImpl implements Service { 

// @AutoSomething how to make this work? 
private Session session; 

자동에 대한 bean scopes을 읽고 @ContextConfiguration 주석

<bean id="Service" class="...ServiceImpl" > 
<property name="session"> 
    getSession()?? // What's the syntax or how to do this? 
</property> 

답변

1
  1. 내 RealTest 감사에 사용되는 스프링 파일. 그것은 당신이하려고하는 주사의 종류를 실제로 만들지 않습니다. 세션 자체를 비즈니스 서비스 클래스에 삽입하면 안됩니다. 대신 범위가 지정된 session 빈을 사용해야합니다.

  2. 테스트 클래스 자체 테스트의 ApplicationContext의하지 일부입니다, 그래서 당신 수 없습니다 테스트 클래스에 대한 테스트 클래스에서 생성 된 값을 자동으로 묶어. 어쨌든 왜 그랬을까요? 이미 테스트 클래스가 있으므로 @Before public void setUp() {} 메서드에서 간단한 설정기를 사용하지 않는 이유는 무엇입니까? 또는 다음 요점을 참조하십시오.

  3. 테스트 클래스 내에 의존성이있는 클래스가있는 경우 @ContextConfiguration보다 도움이되지 않습니다. 테스트 클래스 내부에 @Configuration 클래스를 만들고 Spring Java Config을 사용하여 서비스 클래스를 구성하여 AnnotationConfigApplicationContext을 사용할 수 있습니다.

즉 :

@ContextConfiguration 
public class RealTest extends AbstractTest { 

    @Autowired 
    private ApplicationContext appCtx; 

    private Service service; 

    @Before 
    public void setUp() { 
     AnnotationConfigApplicationContext testCtx = new AnnotationConfigApplicationContext(); 
     testCtx.setParent(this.appCtx); 
     testCtx.register(RealTestCfg.class); 
     testCtx.refresh(); 

     this.service = BeanFactoryUtils.beanOfType(testCtx, Service.class); 
    } 

    @Configuration 
    public static class RealTestCfg { 

     @Bean 
     public Session session() { 
      return AbstractTest.session; 
     } 

     @Bean 
     public Service service() { 
      return new Service(); 
     } 
    } 
} 

당신은 어떤 다른 종속성이없는 경우 @ContextConfiguration 부모 ApplicationContext는 선택 사항입니다. AbstractTest.sessionprotected static이어야하며 protected static 접근자가 있어야합니다.

+0

1. 테스트 프레임 워크에서 테스트에 사용되는 세션이 있고 내 비즈니스 서비스에 주입하려고합니다. 2. 당신이 테스트 -> 테스트가 아니라 테스트 -> 세션에서 세션을 전송하려는 질문을 잘못 이해했다고 생각합니다. 물론 서비스에서 setter를 선언하고 테스트에서 setSession()을 호출 할 수 있지만 원하는 것은 있습니다. 내 의존성을 다룰 봄. – Farmor

+0

'Session '을'Test'에서'Service'로 옮기고 싶다는 것을 알았습니다. 그것은'Test' 종속성 중 하나입니다, 맞습니까? – Roadrunner

+0

맞습니다. – Farmor

관련 문제