我试图在测试类中使用Spring的autowire注释,以便注入一个类的实例。

package com.mycom.mycust.processing.tasks.references;

public class ReferenceIdentifierTest {

    @Autowired
    private FormsDB formsDB;

    @PostConstruct
    @Test
    public void testCreateTopLevelReferencesFrom() throws Exception {
        ReferenceIdentifier referenceIdentifier = new ReferenceIdentifier(formsDB);
    }
}


这是FormsDB类:

package com.mycom.mycust.mysql;

import org.springframework.stereotype.Component;
import java.sql.SQLException;

@Component
public class FormsDB extends KeyedDBTable<Form> {

    public FormsDB(ConnectionFactory factory) throws SQLException {
        super(factory.from("former", new FormsObjectMapper()));
    }
}


这是SpringBootApplication类:

package com.mycom.mycust.processing;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication
@ComponentScan("com.mycom.mycust")
public class Processing implements CommandLineRunner {
    // Code
}


当我运行测试时,formsDB为空。由于我在测试功能上使用了PostConstruct批注,因此我认为由于找不到该类,因此无法自动装配FormsDB。在测试类Autowired中的Autowired members must be defined in valid Spring bean (@Component|@Service...)注释上也有IntelliJ警告。但是我已经将Component注释放在FormsDB类之上,并且还将路径com.mycom.mycust放在SpringBootApplication的ComponentScan注释中。所以我看不出为什么找不到课程。

怎么了

最佳答案

您的测试调用缺少一些重要的注释来使自动装配工作:

@SpringBootTest
@RunWith(SpringRunner.class)
public class ReferenceIdentifierTest {

    @Autowired
    private FormsDB formsDB;

    @Test
    public void testCreateTopLevelReferencesFrom() throws Exception {
        ReferenceIdentifier referenceIdentifier = new ReferenceIdentifier(formsDB);
    }
}


您也可以删除在测试中没有意义的@PostConstruct。

10-05 22:41