Как вызвать блок @BeforeMethod перед @PostConstruct - PullRequest
0 голосов
/ 13 мая 2019

Я пишу ниже кода тестового модуля Spring.Модульный тест @Before метод не выполняется.Так как он напрямую работает @PostConstruct, я получаю ошибки Caused by: java.lang.IllegalArgumentException: rate must be positive, поскольку значение по умолчанию равно 0,00.Я хочу установить какое-либо значение для запроса максимального лимита, чтобы блок postcontstruct проходил гладко.что не так в моем коде?Пожалуйста, помогите.

@Component
public class SurveyPublisher  {

    @Autowired
    private SurveyProperties surveyProperties;

    @PostConstruct
        public void init() {
            rateLimiter = RateLimiter.create(psurveyProperties.getRequestMaxLimit());
        }

    }

    public void publish() {
        rateLimiter.acquire();
        // do something
    }

}

// Класс модульного тестирования

public class SurveyPublisherTest  extends AbstractTestNGSpringContextTests {

    @Mock
    SurveyProperties surveyProperties;

    @BeforeMethod   
    public void init() {
        Mockito.when(surveyProperties.getRequestMaxLimit()).thenReturn(40.00);
    }

    @Test
    public void testPublish_noResponse() {
        //do some test
    }

}

Ответы [ 2 ]

1 голос
/ 13 мая 2019

Только что понял, что он всегда будет запускать метод postConstruct перед методами обратного вызова Junit, потому что весна имеет приоритет. Как объяснено в документации -

если метод в тестовом классе аннотирован @PostConstruct, то метод выполняется перед любыми методами перед базовой структурой тестирования (например, методы, аннотированные с помощью JUnit Jupiter's @BeforeEach), и это относится ко всем методам испытаний в классе испытаний.

Решение вашей проблемы -

  1. Как прокомментировал @chrylis выше, рефакторинг вашего SurveyPublisher, чтобы использовать инжектор конструктора для введения ограничителя скорости. Так что вы можете легко проверить.
  2. Inject Mock / Spy bean, вызывающий проблему
  3. Создать тестовую конфигурацию, чтобы предоставить вам экземпляр класса для использования в качестве @ContextConfiguration

    @Configuration
    public class YourTestConfig {
    
        @Bean
        FactoryBean getSurveyPublisher() {
            return new AbstractFactoryBean() {
                @Override
                public Class getObjectType() {
                    return SurveyPublisher.class;
                }
    
                @Override
                protected SurveyPublisher createInstance() {
                    return mock(SurveyPublisher.class);
                }
            };
        }
    }
    
0 голосов
/ 14 мая 2019

Вот простой, сработал.

@Configuration
@EnableConfigurationProperties(SurveyProperties.class)
    static class Config {
}


@ContextConfiguration(classes = {
        SurveyPublisherTest.Config.class })
@TestPropertySource(properties = { "com.test.survey.request-max-limit=1.00" })
public class SurveyPublisherTest extends AbstractTestNGSpringContextTests {

//Remove this mock
//@Mock
//SurveyProperties surveyProperties;
}
...