1

컨트롤러 중 하나에서 트랜잭션 로직을 테스트하는 스프링 부트를 사용하여 통합 테스트를 작성하려고합니다.스프링 부트 통합 테스트 테스트 컨트롤러 종속성

  1. 를 주입하는 동안 이메일을 보내 실제로 피하기 위해 모의와 컨트롤러 종속성에 이메일 의존성을 교체 @Inject
  2. 를 사용하여 내 컨트롤러 중 하나 : 테스트가 무엇을해야

    은 다음과 같다 통합 테스트.
  3. 컨트롤러의 메서드 호출
  4. 메일 보내기 모의 예외가 throw되면 호출 된 메서드의 트랜잭션이 제대로 롤백됩니다.

지금 내 문제는 테스트가 실행될 때, 컨트롤러가 내 테스트 클래스에 주입하지만, 모든 의존성이 null이다 점이다. 때문에 전체 스프링 웹 애플리케이션 컨텍스트를 시작하는 통합 테스트, 내 컨트롤러가 이미 autowire가 모든 종속성이있을 것이라고 예상하고 있었다되는 시험에

@RunWith(SpringJUnit4ClassRunner.class) 
@IntegrationTest 
@SpringApplicationConfiguration(App.class) 
@WebIntegrationTest 
public MyIntegrationTest() { 

    @Inject MyController controller; 

    @Before 
    public void before() { 
     // replace one particular dependency of controller with a mock 
    } 

    @Test 
    public void testFoo() { ... } 
} 

, 그러나 그것은 분명하지 않다 : 여기 내 통합 테스트입니다 대신에 모든 종속성이 null로 설정됩니다.

질문 : 일부 추가 주석을 사용하거나 내 @Before 방법으로 설정해야합니까? 아니면 완전히 잘못된면에서 문제에 접근하고 있습니까?

업데이트 : TestRestTemplate 또는 MockMvc와 같은 HTTP를 통한 테스트없이 Spring MVC Layer를 테스트 할 수 있습니까? 하지만 직접

답변

0

컨트롤러 자체를 주입하는 대신에 TestRestTemplate으로 테스트하십시오. 컨트롤러는 분명히 스프링 빈이지만 테스트 클래스에 직접 삽입하면 컨텍스트를 초기화 할 수 없다.

@RunWith(SpringRunner.class) 
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = ExampleStart.class) 
public class ExampleTest { 
    @Autowired 
    private TestRestTemplate restTemplate; 

    @Test 
    public void exampleTest() { 
     String body = this.restTemplate.getForObject("/", String.class); 
     assertThat(body).isEqualTo("Hello World"); 
    } 
} 

ExampleStart.java -> 스프링 부팅 스타터 클래스

@Configuration 
@ComponentScan 
@EnableAutoConfiguration 
public class ExampleStart extends SpringBootServletInitializer { 
    @Override 
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { 
     return application.sources(ExampleStart.class); 
    } 

    public static void main(String[] args) { 
     SpringApplication.run(ExampleStart.class, args); 
    } 
} 

참조 : https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-testing.html

하지만 서비스 방법을 테스트하려는 경우, 당신은 @Autowired를 사용하고 평소와 같이 메소드를 호출하십시오.

+0

'@ Autowire '또는'@ Inject'를 사용하여 서비스 클래스를 테스트에 삽입하면 똑같은 일이 발생합니다. 테스트 클래스에 서비스 클래스를 주입 시키지만, 보통'@ Autowire' 나'@Inject'를 사용하여 주입되는 서비스 클래스 내부의 의존성은'null'입니다. 예를 들어, 테스트 클래스에'UserService'를 주입하고 있습니다. 사용자 서비스는'PasswordEncoder' 빈과'UserRepository' 빈을 가지며 모두 null입니다. – lanoxx

+0

답변을 업데이트했으며 방금 테스트를 통과 했으므로 제대로 작동합니다. 실제 컨트롤러 방법이 작동하면 테스트가 작동해야합니다. 당신이 놓친 것을보세요. – Avinash

+0

메인 메소드를 포함하고있는'App.class'는 상당히 간단합니다. 단지'@ SpringBootApplication' 만 사용하고'configure' 메소드는 없습니다. – lanoxx

관련 문제