无法在 SpringBoot 的集成测试中执行@Autowired Bean



我在 SpringBoot 2.x 上有一个应用程序

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
public class WebSpringBootJarApplication extends SpringBootServletInitializer implements WebApplicationInitializer {
public static void main(String[] args) {
SpringApplication.run(WebSpringBootJarApplication.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(WebSpringBootJarApplication.class);
}
}

绒球.xml

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>weblogic.war.spring.boot</groupId>
<artifactId>weblogic-war-spring-boot</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>weblogic-war-spring-boot</name>
<packaging>war</packaging>

这是应该自动连线的类...

@Service
public class CompanyReadServiceImpl implements CompanyReadService {
private CompanyMapper companyMapper;
private CompanyReadRepository companyReadRepository;

@Autowired
public CompanyReadServiceImpl(CompanyMapper companyMapper,
CompanyReadRepository companyReadRepository) {
this.companyMapper = companyMapper;
this.companyReadRepository = companyReadRepository;
}
@Transactional
@Override
public CompanyDto getById(Long id) {
Company company = find(id);
return transform(company);
}

@Transactional
@Override
public boolean isByName(String name) {
return this.companyReadRepository.findByName(name).isPresent();
}
@Transactional
@Override
public CompanyDto getByName(String name) {
Company company = companyReadRepository.findByName(name).orElse(new Company());
return transform(company);
}
private Company find(Long id){
return this.companyReadRepository.findById(id).orElseThrow(() -> new RuntimeException("User not found"));
}
private CompanyDto transform(Company company){
return this.companyMapper.companyToCompanyDto(company);
}
}

绒球.xml

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>

更新

这个类来自类似的项目,它工作(但 Intellij 想法将这些字段标记为错误(

src/test/java/weblogic/war/spring/boot/service/read/CompanyReadServiceTest中.java

@RunWith(SpringRunner.class)
@SpringBootTest
public class CompanyReadServiceTest {
private static final Logger LOGGER = LoggerFactory.getLogger(CompanyReadServiceTest.class);
private static String NAME_METHOD_READ_BY_NAME_BOOLEAN = "isByName";
@Autowired
private CompanyReadRepository companyReadRepository;
@Autowired
private CompanyReadService companyReadService;
@Autowired
private CompanyReadRepositoryTest companyReadRepositoryTest;
@Autowired
private CompanyMapper companyMapper;
@Test
public void getById() {
Company lastEntry = getLastEntry();
Long idExpected = null;
if(lastEntry != null) idExpected = lastEntry.getId();
if(idExpected != null){
CompanyDto companyDto = searchByIdEntry(idExpected);
Long idActual = companyDto.getId();
Assert.assertEquals("Lookup of entry - failed!!!", idExpected, idActual );
}
}
@Test
public void isByName() {
Company lastEntry = getLastEntry();
String name = null;
if(lastEntry != null) name = lastEntry.getName();

if(name != null){
boolean entryByName = isEntryByName(name);
Assert.assertTrue("Lookup of entry - failed", entryByName);
}
}

private CompanyDto searchByIdEntry(Long id){
return this.companyReadService.getById(id);
}

private boolean isEntryByName(String name){
return getByNameReflection(companyReadService, NAME_METHOD_READ_BY_NAME_BOOLEAN, name);
}

private Company getLastEntry() {
Optional<Company> lastEntry = companyReadRepositoryTest.getLastEntry();
return lastEntry.orElse(null);
}

}

我复制一个项目。

update_2

我清除了本地 Maven 存储。 IDE 还会(在编译时(突出显示可能未自动连接的字段。但是我运行一个测试类并且它可以工作...

为什么?(这可能是在我刚刚重命名包并编辑 pom 时开始的.xml(

自动接线在应用程序的工作范围内发生良好,但在测试应用程序范围内不起作用。

谁可以分享关于这个问题的想法?

您正在尝试加载实际的应用程序上下文以实现 Junit 目的。 你可以使用以下方法执行此操作 其中 WebSpringBootJarApplication 类是原始的 Spring 上下文

@RunWith(SpringRunner.class)
@ContextConfiguration(classes = {WebSpringBootJarApplication.class})
public class HelloWorldTest {
@Autowired(required = true)
SomeService service;
@Test
public void helloTest() {
System.out.println(service);
}
}

最新更新