programing

SpringBoot에서 콩을 추가하는 방법시험

javamemo 2023. 7. 29. 08:05
반응형

SpringBoot에서 콩을 추가하는 방법시험

그 질문은 매우 간단해 보이지만, 이상하게도 저는 해결책을 찾지 못했습니다.

제 질문은 콩을 추가/신고하는 것입니다.SpringBootTest한 사람을 무시하거나 모키토를 사용하여 조롱하지 않습니다.

다음은 실제 요구사항을 가장 단순하게 구현하려고 시도했을 때 얻은 결과입니다(그러나 효과가 없습니다).

일부 서비스, 빈 및 구성:

@Value // lombok
public class MyService {
    private String name;
}

@Value // lombok
public class MyClass {
    private MyService monitoring;
}

@Configuration
public class SomeSpringConfig {

    @Bean
    public MyClass makeMyClass(MyService monitoring){
        return new MyClass(monitoring);
    }
}

테스트:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = { SomeSpringConfig.class })
public class SomeSpringConfigTest {

    private String testValue = "testServiceName";

    // this bean is not used
    @Bean
    public MyService monitoringService(){ return new MyService(testValue); }

    // thus this bean cannot be constructed using SomeSpringConfig 
    @Autowired
    public MyClass myClass;

    @Test
    public void theTest(){
        assert(myClass.getMonitoring().getName() == testValue);
    }
}

이제, 제가 교체한다면,@Bean public MyService monitoring(){ ... }타고@MockBean public MyService monitoring;,그건 효과가 있다.저는 콩을 쉽게 조롱할 수 있지만 단순히 콩을 제공할 수 없다는 것이 이상하다고 생각합니다.

=> 그럼 한 번의 테스트를 위해 제가 직접 만든 콩을 어떻게 추가해야 할까요?

편집:

  • ThreeDots의 답변(구성 테스트 클래스 만들기)이 일반적인 권장 사항이라고 생각합니다.
  • 그러나 Danylo의 답변(@ContextConfiguration 사용)은 제가 질문한 내용에 더 잘 맞습니다. 즉, 테스트 클래스에 @Bean을 직접 추가합니다.

스프링 테스트는 사용 중인 구성(따라서 로드되는 콩을 스캔할 위치)을 알아야 합니다.원하는 것을 달성하기 위해 가장 기본적인 옵션은 다음 두 가지입니다.

  1. 빈을 포함하는 테스트 클래스 외부에 구성 클래스 만들기

    @Configuration
    public class TestConfig {
    
        @Bean
        public MyService monitoringService() {
            return new MyService();
        }
    }
    

그런 다음 에 추가하여 구성 클래스로 테스트합니다.@SpringBootTest(classes = { SomeSpringConfig.class, TestConfig.class })

또는

  1. 이 특정 테스트에서만 이 구성을 사용해야 하는 경우 정적 내부 클래스에서 정의할 수 있습니다.

    public class SomeSpringConfigTest {
    
        @Configuration
        static class ContextConfiguration {
    
            @Bean
            public MyService monitoringService() {
                return new MyService();
            }
        }
    }
    

스프링 부트 테스트를 통해 이를 자동으로 인식하고 로드합니다.

구성을 다음과 같이 추가합니다.

@ContextHierarchy({
    @ContextConfiguration(classes = SomeSpringConfig.class)
})

이 경우에 제가 사용하는 것은@Import:

@DataJpaTest(showSql = false)
//tests against the real data source defined in properties
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
@Import(value = {PersistenceConfig.class, CustomDateTimeProvider.class})
class MessageRepositoryTest extends PostgresBaseTest {
....

여기서는 미리 구성된 "테스트 슬라이스"를 사용합니다.이 경우 JpaAuditingConfig를 추가해야 합니다.

하지만 당신이 당신에게 했던 것처럼 다른 콩들을 더하는 것이 어때요?SomeSpringConfig.class?:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = { SomeSpringConfig.class, OtherBean.class })
public class SomeSpringConfigTest {
...

테스트에 나열된 모든 항목은 직접 주입할 수 있으며, 모든 항목이 모의로 추가되어야 합니다.

언급URL : https://stackoverflow.com/questions/57772342/how-to-add-a-bean-in-springboottest

반응형