我正在编写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
}}
2 回答
ITMISS
TA贡献1871条经验 获得超8个赞
刚刚意识到它将始终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); } }; }}
添加回答
举报
0/150
提交
取消