p.z*_*idz 5 java spring spring-boot
在 Spring Boot 1.4 版本中,一些测试注释已被弃用,“转而支持 {@link SpringBootTest}”。
然而,简单地用新的注释替换已弃用的注释,会给我带来一个奇怪的副作用,@PostConstruct 被调用两次。
所以我们假设它是之前
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = {ApplicationTestContext.class})
@IntegrationTest
@Transactional
public class EmployeesControllerSpringTest {
@Inject
private EmployeeRepository employeeRepository;
@Inject
private VenueRepository venueRepository;
@Inject
private TestUtilDummyObjects dummyObjects;
@Inject
private MappingJackson2HttpMessageConverter jacksonMessageConverter;
@Inject
private EntityManager entityManager;
@Inject
private ExceptionTranslator exceptionTranslator;
private MockMvc mockMvc;
@PostConstruct
public void postConstruct() {
EmployeesController sut = new EmployeesController(employeeRepository);
mockMvc = MockMvcBuilders
.standaloneSetup(sut)
.setControllerAdvice(exceptionTranslator)
.setMessageConverters(jacksonMessageConverter)
.build();
}
Run Code Online (Sandbox Code Playgroud)
因此,用以下内容替换已弃用的注释
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {ApplicationTestContext.class})
@Transactional
Run Code Online (Sandbox Code Playgroud)
导致 @PostConstruct 被调用两次。
也许有人可以建议,我做错了什么?
请参阅下面的ApplicationTestContext.class:
//@TestConfiguration
//@SpringBootConfiguration
@ComponentScan(excludeFilters = {@ComponentScan.Filter(type = FilterType.REGEX,
pattern = "somepath.*")})
@EnableAutoConfiguration(exclude = {MetricFilterAutoConfiguration.class, MetricRepositoryAutoConfiguration.class})
@EnableConfigurationProperties({ApplicationProperties.class, LiquibaseProperties.class})
@EnableAspectJAutoProxy(proxyTargetClass = false)
public class ApplicationTestContext extends WebMvcConfigurerAdapter {
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addConverter(new LocalDateConverter(Constants.DATE_FORMAT));
registry.addConverter(new LocalDateTimeConverter(Constants.DATE_TIME_FORMAT));
}
Run Code Online (Sandbox Code Playgroud)
}
更新
按照@bhantol sugestion(摆脱所有冗余注释),我尝试运行官方示例https://spring.io/guides/gs/spring-boot/。
只需下载源代码并将 @Before 更改为 @PostConstruct 仍然会导致它被调用两次。
示例代码如下:
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class HelloControllerIT {
@LocalServerPort
private int port;
private URL base;
@Autowired
private TestRestTemplate template;
//@Before
@PostConstruct
public void setUp() throws Exception {
this.base = new URL("http://localhost:" + port + "/");
System.out.println("");
}
@Test
public void getHello() throws Exception {
ResponseEntity<String> response = template.getForEntity(base.toString(),
String.class);
assertThat(response.getBody(), equalTo("Greetings from Spring Boot!"));
}
}
Run Code Online (Sandbox Code Playgroud)
不确定,但似乎是一个潜在的错误。