简体   繁体   English

如何从 maven 模块获取 spring 上下文

[英]How to get spring context from maven module

I'm having an issue trying to make test in my spring-boot project.我在尝试在我的 spring-boot 项目中进行测试时遇到问题。

architecture建筑学

as you can see, my project is devided with maven modules.如您所见,我的项目由 maven 模块组成。 "alta-launcher" is the "main" project getting every other module as dependencies. “alta-launcher”是将所有其他模块作为依赖项的“主”项目。 The problem is that my tests in the user module won't get the spring context so my fields "Autowired" will be null on runtime.问题是我在用户模块中的测试不会得到 spring 上下文,所以我的字段“Autowired”在运行时将是 null。

Any ideas how to configure this project to be able to do tests in each modules?任何想法如何配置这个项目以便能够在每个模块中进行测试?

Edit:编辑:

@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());
}

The annotation @SpringBootTest with the attribute classes is unusable because I don't have access to the launcher module from user module.带有属性类的注释 @SpringBootTest 无法使用,因为我无法从用户模块访问启动器模块。 And without the attribute (juste @SprinBootTest) is when I'm getting my autowire field null which makes sense cause I don't have the context.没有属性(juste @SprinBootTest)是当我得到我的自动装配字段 null 时,这是有道理的,因为我没有上下文。

You can recreate your custom context in tests, try something like this:您可以在测试中重新创建自定义上下文,尝试如下操作:

@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());
}

I was able to fix the issue by using ContextConfiguration annotation.我能够通过使用 ContextConfiguration 注释来解决这个问题。 (ExtendWith is for the junit5 part) (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());
}

and here is my configurationTest.java这是我的配置Test.java

@TestConfiguration
public class ConfigurationTest {

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

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM