Spring boot 2.1 тест не пройден из-за нулевого свойства - PullRequest
0 голосов
/ 16 ноября 2018

Я не эксперт в 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()

Любая подсказка, почему она не работает?Спасибо.

1 Ответ

0 голосов
/ 16 ноября 2018

@Autowired MysqlProperties mysqlProperties - ноль, потому что вы создали новый экземпляр MainController здесь:
mvc = MockMvcBuilders.standaloneSetup(new MainController()).build();
Этот экземпляр не будет зарегистрирован в контексте Spring, поэтому он не будет доступен для внедрения зависимостей.
Вы можете прочитать больше об этой проблеме здесь

Вы должны использовать автопровод MainController в вашем классе MainControllerTest.

@Autowired
private MainController mainController;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...