복붙노트

[SPRING] Spring @DirtiesContext가 Spring 컨텍스트를 다시로드합니까?

SPRING

Spring @DirtiesContext가 Spring 컨텍스트를 다시로드합니까?

다음과 같은 테스트 클래스가 있습니다.

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:/test-context.xml"})
@DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD)
public abstract class TestClass {
  @Rule @Resource public JUnitRuleMockery jMockContext;

  public void test1() {
    //Expectations and test
  }
  public void test2() {
    //Expectations and test
  }
}

test-context.xml에서 JUnitRuleMockery와 몇 가지 mock 객체를 팩토리 메소드를 통해 정의합니다.

<bean id="mockContextFactory" class="MockContextFactory" />

<bean id="jMockContext" factory-bean="mockContextFactory" factory-method="getContext" scope="prototype" />

<bean id="firstMock" factory-bean="mockContextFactory" factory-method="getFirstMock" />

<bean id="secondMock" factory-bean="mockContextFactory" factory-method="getSecondMock" />

MockContextFactory

public class MockContextFactory
{
  private JUnitRuleMockery jUnitRuleMockery;

  public MockContextFactory() {
    jUnitRuleMockery = new JUnitRuleMockery();
    jUnitRuleMockery.setThreadingPolicy(new Synchroniser());
  }

  public JUnitRuleMockery getContext() {
    return jUnitRuleMockery;
  }

  public FirstMock getFirstMock() {
    return jUnitRuleMockery.mock(FirstMock.class);
  }
  //others getter
}

TestClass에는 @DirtiesContext 어노테이션으로 인해 여러 테스트 메소드가 있는데 각 테스트가 모의 객체에 대한 기대치를 설정하기 때문에 매번 Spring 컨텍스트를 다시로드해야하기 때문에 Spring 컨텍스트가 각 테스트 실행 후에 다시로드되기를 기대하고 있습니다. 여기에서 @DirtiesContext를 참조하십시오. 그러나 Spring 컨텍스트가 다시로드되지 않는 것으로 보입니다. 사실, test2의 시작 부분에 디버그 모드로 들어가는 것 같습니다 (아마도 test1이 먼저 실행되었을 것입니다). jMockContext가 test1의 기대치, 실행 목록 및 오류 (있는 경우) . 따라서 몇 가지 질문으로 끝나기 위해 @DirtiesContext는 Spring 컨텍스트를 다시로드하게 만듭니다 (Spring Docs에서 알 수 있듯이). 그렇지 않으면 주석을 오해 했습니까? 첫 번째 경우에 내가 뭘 잘못하고 있니? 후자의 경우, 모든 컨텍스트에서 스프링 컨텍스트를 강제로 다시로드 할 수 있습니까?

편집 : 문제를 구분하기 위해 : 나는 위의 샘플과 같은 코드를 며칠 째 실행 한 다음 오늘은 실패한 기대를 추가 한 새로운 테스트를 만들었습니다. 그런 다음, 같은 이유로 다른 모든 테스트가 실패한 것을 보았습니다 (오늘까지는 녹색 이었음). 디버깅, 나는 jMockContext가 결코 지워지지 않았다는 것을 알았습니다. 즉, 모든 테스트가 동일한 풀에 기대치를 추가한다는 것을 의미합니다. 물론 기대가 실패하지 않는 한 투명했고 테스트를하지 못했습니다. test2는 아직 전달되지 않은 기대치 풀이 없으므로 문제가 없었습니다.)하지만 이전 상황이 마음에 들지 않아 이전에 설정 한 기대치없이 각 테스트를 시작하고 싶습니다.

해결법

  1. ==============================

    1.여기 내 해결책이있다. 이것이 Spring 3.2에만 국한되는지 또는 일반적인 오해인지는 모르겠지만 @DirtiesContext (classMode = ClassMode.AFTER_EACH_TEST_METHOD)를 사용하는 것만으로는 각 Spring 컨텍스트 전체를 다시로드 할 수 없습니다. @TestExecutionListeners에 DirtiesContextTestExecutionListener도 추가해야했습니다. 그래서, 결국, 나를 위해 일한 것은 단지 TestClass의 주석을

    여기 내 해결책이있다. 이것이 Spring 3.2에만 국한되는지 또는 일반적인 오해인지는 모르겠지만 @DirtiesContext (classMode = ClassMode.AFTER_EACH_TEST_METHOD)를 사용하는 것만으로는 각 Spring 컨텍스트 전체를 다시로드 할 수 없습니다. @TestExecutionListeners에 DirtiesContextTestExecutionListener도 추가해야했습니다. 그래서, 결국, 나를 위해 일한 것은 단지 TestClass의 주석을

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations = {"classpath:/test-context.xml"})
    @DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD)
    @TestExecutionListeners({DirtiesContextTestExecutionListener.class})
    public abstract class TestClass
    

    그밖에 다른 것은 변하지 않습니다.

  2. from https://stackoverflow.com/questions/21239875/does-spring-dirtiescontext-reload-spring-context by cc-by-sa and MIT license