【问题标题】:How to get spring context from maven module如何从maven模块获取spring上下文
【发布时间】:2020-12-09 20:25:08
【问题描述】:

我在尝试在我的 spring-boot 项目中进行测试时遇到问题。

architecture

如您所见,我的项目由 maven 模块组成。 “alta-launcher”是将所有其他模块作为依赖项的“主”项目。 问题是我在用户模块中的测试不会获得 spring 上下文,所以我的字段“Autowired”在运行时将为空。

任何想法如何配置此项目以能够在每个模块中进行测试?

编辑:

@SpringBootTest(classes = CoreApplication.class)
class UserQueryTransformerImplTest {
@Autowired
private UserQueryTransformer userQueryTransformer;

@Test
void toDTO() {
    UserEntity userEntity = new UserEntity();
    userEntity.setLogin("everest");
    userEntity.setFirstName("Everest");
    userEntity.setLastName("Mountain");
    UserQueryDTO userQueryDTO = userQueryTransformer.toDTO(userEntity);

    assertEquals(userEntity.getLogin(), userQueryDTO.getLogin());
    assertEquals(userEntity.getFirstName(), userQueryDTO.getFirstName());
    assertEquals(userEntity.getLastName(), userQueryDTO.getLastName());
}

带有属性类的注释@SpringBootTest 无法使用,因为我无法从用户模块访问启动器模块。没有属性(juste @SprinBootTest)是当我让我的自动装配字段为空时,这是有道理的,因为我没有上下文。

【问题讨论】:

  • 浏览文档:spring.io/guides/gs/multi-module。它几乎涵盖了您可能需要的所有内容!
  • 感谢您的回答,但我已经多次阅读此文档,但对我的情况没有帮助...我的项目分为作为我的域的模块,模块启动器正在获取其他模块作为依赖项,所以我没有来自这些模块的上下文:(
  • 您的自动连线字段不能是null。您的应用程序或测试会以 UnsatisfiedDependencyException 代替。因此,如果他们是null,那么您做错了(不使用 Spring 运行您的测试,自己创建实例等)。但是,由于您只发布了项目结构的图像并且没有添加实际测试,因此无法判断。
  • 我编辑了我的帖子,以便您获得更多信息。希望对你有帮助
  • 您不能将 Spring Boot jar 作为依赖项包含在另一个项目中。 Spring BOot fat jar 具有不同的结构(由于类的自定义加载),因此类不可用。如果你真的想要这个,你将不得不提供 2 个工件 1 个 fatjar 和一个包含类的 non-fatjar(一个常规 jar)。

标签: java spring spring-boot unit-testing multi-module


【解决方案1】:

我能够通过使用 ContextConfiguration 注释来解决这个问题。 (ExtendWith 用于 junit5 部分)

@ContextConfiguration(classes = ConfigurationTest.class)
@ExtendWith(SpringExtension.class)
class UserQueryTransformerImplTest {
@Autowired
private UserQueryTransformer userQueryTransformer;

@Test
void toDTO() {
    UserEntity userEntity = new UserEntity();
    userEntity.setLogin("everest");
    userEntity.setFirstName("Everest");
    userEntity.setLastName("Mountain");
    UserQueryDTO userQueryDTO = userQueryTransformer.toDTO(userEntity);

    assertEquals(userEntity.getLogin(), userQueryDTO.getLogin());
    assertEquals(userEntity.getFirstName(), userQueryDTO.getFirstName());
    assertEquals(userEntity.getLastName(), userQueryDTO.getLastName());
}

这是我的 configurationTest.java

@TestConfiguration
public class ConfigurationTest {

@Bean
UserQueryTransformer createUserQueryTransformer() {
    return new UserQueryTransformerImpl();
}

@Bean
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
UserQueryDTO createUserQueryDTO() {
    return new UserQueryDTO();
}

【讨论】:

    【解决方案2】:

    你可以在测试中重新创建你的自定义上下文,试试这样:

    @ContextConfiguration
    @RunWith(SpringRunner.class)
    class UserQueryTransformerImplTest {
    @TestConfiguration
    static class Config {
      @Bean
      public UserQueryTransformer uqt() {
         return new UserQueryTransformer();
      }
    }
    @Autowired
    private UserQueryTransformer userQueryTransformer;
    
    @Test
    void toDTO() {
        UserEntity userEntity = new UserEntity();
        userEntity.setLogin("everest");
        userEntity.setFirstName("Everest");
        userEntity.setLastName("Mountain");
        UserQueryDTO userQueryDTO = userQueryTransformer.toDTO(userEntity);
    
        assertEquals(userEntity.getLogin(), userQueryDTO.getLogin());
        assertEquals(userEntity.getFirstName(), userQueryDTO.getFirstName());
        assertEquals(userEntity.getLastName(), userQueryDTO.getLastName());
    }
    

    【讨论】:

    • 感谢您的回答,但它仍然无法正常工作,我尝试了嵌套类和导入。对于嵌套类,我的 autowired 仍然为空。通过导入,我得到一个 IllegalStateException : Unable to find a SpringBootConfiguration ...
    • 实际上它更像是当我使用 SpringBootTest 时,我得到了非法状态异常,如果我不使用它,自动装配为空。看起来它真的不关心 TestConfiguration(嵌套或导入)
    • 你好,尝试添加@ContextConfiguration注解。
    猜你喜欢
    • 1970-01-01
    • 2022-09-27
    • 2019-04-21
    • 1970-01-01
    • 2020-05-20
    • 1970-01-01
    • 2010-11-17
    • 1970-01-01
    • 2015-01-26
    相关资源
    最近更新 更多