Я не эксперт в Spring Boot.Я должен написать тесты для моих @RestController
методов, но у меня проблема: класс @AutoWired
ConfigurationProperties
равен null
, когда тестовый класс выполняет main controller
.Я нашел много сообщений о подобной проблеме здесь, но они действительно не решают эту проблему.Странно то, что в методе @PostConstruct @RestController
класс свойства не равен нулю, он равен нулю только в @RequestMapping
методах, которые я пытаюсь проверить.
Это мой @SpringBootApplication
class:
@SpringBootApplication
@ComponentScan
@EnableConfigurationProperties({MysqlProperties.class, CassandraProperties.class, GenericsProperties.class})
@EnableAutoConfiguration
public class REST {
public static void main(String[] args) {
SpringApplication.run(REST.class, args);
}
}
Это @RestController:
@RestController
public class MainController {
@Autowired
private MysqlProperties mysqlProperties;
@PostConstruct
public void init() throws Exception {
//Here mysqlProperties is not null and I can get elements from it
}
@RequestMapping(value = "/online", method = RequestMethod.GET)
public @ResponseBody
String online(@RequestHeader(value = "email", required = true) String email, @RequestHeader(value = "password", required = true) String password) {
Utils.logInfo(logger, "/online endpoint");
//Here mysqlProperties is null
String sql = "SELECT * FROM " + mysqlProperties.getAddress() + " WHERE email= ?";
return new Return(Return.ERROR_MESSAGE, "Access denied, not superuser").toString();
}
Это класс @ConfigurationProperties:
@Configuration
@PropertySource("classpath:application.properties")
@ConfigurationProperties(prefix = "mysql")
public class MysqlProperties {
String address;
String database;
...
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getDatabase() {
return database;
}
public void setDatabase(String database) {
this.database = database;
}
}
Это тест:
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {REST.class})
@EnableConfigurationProperties({CassandraProperties.class, GenericsProperties.class, MysqlProperties.class})
@AutoConfigureMockMvc
public class MainControllerTest {
@Autowired
private MockMvc mvc;
@Autowired
private GenericsProperties genericsProperties;
@Before
public void init() {
try {
//mc.init();
mvc = MockMvcBuilders.standaloneSetup(new MainController()).build();
} catch (Exception ex) {
ex.printStackTrace();
Logger.getLogger(MainControllerTest.class.getName()).log(Level.SEVERE, null, ex);
}
}
@Test
public void testOnline() throws Exception {
//Return returnObject = new Return(Return.DONE_MESSAGE, "System online");
Return returnObject = new Return(Return.ERROR_MESSAGE, "Access denied, not superuser");
this.mvc.perform(get("/online")
.header("email", genericsProperties.getSuperuser_email())
.header("password", genericsProperties.getSuperuser_password()))
//.contentType(APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(content().json(returnObject.toString()));
}
}
Это структура пакета:
main
--java
----configurations
------MysqlProperties.java
----main
------MainController.java
----...
--resources
----application.properties
test
--java
----main
------MainControllerTest.java
В классе MainController возникает исключение NullPointerException по адресу:
mysqlProperties.getAddress()
Любая подсказка, почему она не работает?Спасибо.