【问题标题】:DataJpaTest vs SpringBootTestDataJpaTest 与 SpringBootTest
【发布时间】:2022-01-14 10:36:57
【问题描述】:

我正在使用@DataJpaTest 来测试我的(春季数据修订)存储库的功能。在我更改要保存的实体中的功能之前,一切正常。 我有需要更改的 currentUser 的回调方法(@PrePersist 和 @PreUpdate)。我通过 SecurityContext 确定用户并作为我的 ConfigurationProperties 的后备。实体编码如下。

    @PrePersist
    public void onCreation() {
        final String user = KVLUserProvider.ermittleAngemeldetenUserMitFallback();
        this.erstellungsCcid = user;
        this.veraenderungsCcid = user;

        final LocalDateTime time = ZeitHelper.jetzt();
        this.erstellungsZeitpunkt = time;
        this.veraenderungsZeitpunkt = time;
    }

    @PreUpdate
    public void onModification() {
        LocalDateTime zpAlt = this.veraenderungsZeitpunkt;
        this.veraenderungsCcid = KVLUserProvider.ermittleAngemeldetenUserMitFallback();
        this.veraenderungsZeitpunkt = ZeitHelper.jetzt();
        logger.trace("onModification {} {} vorher {} nachher {}", this.getClass().getSimpleName(), this.getId(), zpAlt, veraenderungsZeitpunkt);
    }

KVLUserProvider 如下所示。

 private KVLUserProvider(){}

      public static String ermittleAngemeldetenUserMitFallback() {
        String user = Optional
                .of(SecurityContextHolder.getContext().getAuthentication() != null ?
                        SecurityContextHolder.getContext().getAuthentication().getName() : null)
                .orElse(ApplicationContextProvider.getApplicationContext()
                        .getBean(KVLProperties.class).getTechnischerUser());
        logger.debug("Der KVLUserProvider hat folgenden User ermittelt: {}", user);
        return user;
    }

问题发生在上面提到的类中,我试图通过 ApplicationContextProvider 获取 ApplicationContext。 Provider 实现了 ApplicationContextAware 接口,这会导致 Spring Boot 调用实现类中的 setAppicationConext 方法。在这里要完整的是ApplicationContextProvider。

@Component
public class ApplicationContextProvider implements ApplicationContextAware {

    private static ApplicationContextProvider instance;

    private ApplicationContextProvider() {
    }

    private ApplicationContext applicationContext;

    public static ApplicationContext getApplicationContext() {
        if (instance == null) {
            throw new RuntimeException("ApplicationContext has not been injected yet!");           
        }
        return instance.applicationContext;
    }

    private static void setProviderInstance(ApplicationContextProvider provider) {
        instance = provider;
    }

    @Override
    public void setApplicationContext(ApplicationContext acx) throws BeansException {
        applicationContext = acx;
        setProviderInstance(this);
    }
}

问题是 @DataJpaTest 在生命周期的 PreInitialization 阶段之前调用 setApplicationContext 方法的缺失部分是什么?有没有一种@Enable...注解来实现这一点?

测试看起来像这样。

    @SpringBootTest 
    //@DataJpaTest
    //@AutoConfigureJdbc
    //@Import(DatabaseConfig.class)
    @WithMockUser
    @SpringBootTest 

    class Test {
    @Autowired
    private ARepository aRepository;

    @Autowired
    private ZRepository zRepository;


    @Test
    void testSaveUndUpdateA() {

        Z z = new Z();
        final Z savedZ = zRepository.save(z);
        assertThat(savedZahlungsInformation).isNotNull();

        A a = ABuilder.get(savedZ).build();
        final A savedA = aRepository.save(a);
        assertThat(savedA).isNotNull();

        savedA.setZBetrag(BigDecimal.TEN);
        aRepository.save(auszahlung);

        final Optional<A> actual = Repository.findById(savedA.getId());
        assertThat(actual).isPresent();
        assertThat(actual.get().getId()).isEqualTo(z.getId());
        assertThat(actual.get().getZBetrag()).isEqualTo(BigDecimal.TEN.setScale(2, RoundingMode.UNNECESSARY));
    }

测试是绿色的,因为我将其更改为 SpringBootTest。在我更改之前,它是一个 DataJpaTest,并且以另一种方式提供了用户。 当我以 da DAtaJpaTest 身份运行测试时,它失败了,因为缺少 ApplicationContext。

亲切的问候。

【问题讨论】:

标签: spring-boot spring-data-jpa lifecycle applicationcontext


【解决方案1】:

如果错误是“ApplicationContext 尚未注入!”

尝试在 Test 类之上添加

@Import({ApplicationContextProvider.class})

如果之后您收到“NoSuchBeanDefinition: No qualifying bean of type '...KVLProperties' available”的错误,也将 KVLProperties 添加到注解中

@Import({ApplicationContextProvider.class, KVLProperties.class})

【讨论】:

    猜你喜欢
    • 2019-12-27
    • 2019-10-20
    • 1970-01-01
    • 2019-02-14
    • 2017-09-28
    • 2020-03-13
    • 2018-01-08
    • 2019-10-06
    • 1970-01-01
    相关资源
    最近更新 更多