2017-10-25 5 views
2

에로드 된 클래스의 내부에 자동으로 묶어 다른 클래스 I이 봄에 다음과 같은 시나리오 : 내 테스트 클래스의 ClassA (더 정확하게하기 위해 Autowiring은)를 사용하고봄 : Junit와

public class ClassA{ 

@Autowired 
private ClassB classB; 
} 

. 하지만 어떻게 든하고 싶은데 ClassB 그냥 내 Junit에 대한 수정, 그걸로, ClassA 내 테스트 클래스에서 autowired 경우 (원래 하나 대신) 수정 된 ClassB로드합니다.

그 방법이 있습니까?

+0

정상적인 실행을위한 구성과 테스트 사례를위한 구성이 필요하다고 생각합니다. – Alex

+0

기본적으로 ClassA의 복사본을 만들고 수정 된 클래스 B를 autowire라고 말하면 내 junit에서 사용합니까? 이전에 해봤지만 이번에는 그 접근법을 피하고 싶습니다. 내가 원하는 것을 할 수있는 스프링 메커니즘이 있다면 생각하고있다. – Columb1a

+0

이것은 인터페이스와 구현 클래스를 사용하는 것이 좋은 이유입니다. 사실, 가장 좋은 방법은 생성자 삽입을 사용하는 것입니다. 즉, Spring을 전혀 사용하지 않고 유닛 테스트를 실행할 수 있습니다 (생성자에게 모의 객체 전달). – chrylis

답변

1

빈 구성을 사용하지 않으면이 작업을 수행 할 수있는 다른 방법을 생각할 수 없습니다. 당신은 2 가지 방법으로 구성 할 수 있습니다

첫째 :

@Configuration 
public class AppConfig { 

    @Bean 
    public ClassB classB() { 
    return new ClassB() { 
     // this is a subclass that inherits everything from ClassB, so override what you want here 
    } 
    } 
} 

둘째 : 마지막으로 (here에서 촬영)

@RunWith(SpringRunner.class) 
@SpringBootTest 
public class SomeTest { 

    // do this if you only want the modified classB in 1 place 
    @Configuration 
    static class TestConfig { 
     @Bean 
     public ClassB classB() { 
      return new ClassB() { 
      // same as the first 
      } 
     } 
    } 

    @Test 
    public void testMethod() { 
    // test 
    } 
} 

, 새 인터페이스를 만들 수 있습니다 메인 폴더에 ClassBClassBImpl,테스트 폴더에. 여전히 구성 중 하나를 사용해야합니다.