如何在@PostConstruct之前调用@BeforeMethod块

我正在编写Spring Unit测试代码。单元测试@Before方法没有被执行。因为它直接运行@PostConstruct我得到了erorrs,Caused by: java.lang.IllegalArgumentException: rate must be positive因为默认值是0.00。我想设置一些值来请求最大限制,以便postcontstruct块顺利通过。我的代码有什么问题?请帮忙。

@Componentpublic 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
    }}


哔哔one
浏览 1758回答 2
2回答

ITMISS

刚刚意识到它将始终postConstruct在Junit回调方法之前运行方法导致spring优先。如文件中所述 -如果测试类中的方法使用@PostConstruct注释,则该方法在基础测试框架的任何before方法之前运行(例如,使用JUnit Jupiter的@BeforeEach注释的方法),并且该方法适用于测试类中的每个测试方法。解决方案问题 -正如@chrylis在上面评论的那样重构你SurveyPublisher使用构造函数注入来注入速率限制器。所以你可以轻松测试。注入引起问题的Mock / Spy bean创建测试配置以提供要用作的类的实例 @ContextConfiguration@Configurationpublic class YourTestConfig {     @Bean     FactoryBean getSurveyPublisher() {         return new AbstractFactoryBean() {             @Override             public Class getObjectType() {                 return SurveyPublisher.class;             }             @Override             protected SurveyPublisher createInstance() {                 return mock(SurveyPublisher.class);             }         };     }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java