gpt4 book ai didi

spring - @Autowired 不应该在没有 @RunWith(SpringRunner.class) 的情况下工作,但可以

转载 作者:行者123 更新时间:2023-12-04 12:31:15 25 4
gpt4 key购买 nike

这是一个用于 java spring 数据存储库层的单元测试类。
我有一个spring数据存储库层,其中使用@Autowired注解注入(inject)TestEntityManager类型对象(属于spring数据包)。
Autowiring 工作无需添加@RunWith(SpringRunner.class) 注释!
那么问题出在哪里呢?好吧,我认为在不向类中添加 @RunWith(SpringRunner.class) 注释的情况下,注入(inject)是不可能的:理论上,如果没有它,它应该无法工作。
这怎么可能 ?有人有答案吗?
>>>> view complete spring boot app code on github available here

  • 别人有过 相反的问题 在 stackoverflow 中:

  • Someone else have had the opposite problem : see link here
    这是我奇怪的代码块,它非常有效:
    包 org.loiz.demo;
    import org.assertj.core.api.BDDAssertions;
    import org.junit.Assert;
    import org.junit.jupiter.api.DisplayName;
    import org.junit.jupiter.api.MethodOrderer;
    import org.junit.jupiter.api.Test ;
    import org.junit.jupiter.api.TestMethodOrder;
    import org.junit.jupiter.api.Order ;

    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
    import org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManager;
    import org.springframework.test.annotation.Rollback;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringRunner;

    import demo.LoizBootSpringDemoApplication;
    import demo.crepository.UserRepositoryInterface;
    import demo.dmodel.User;
    import demo.helper.helperUtils;

    //Test de la couche de persistence
    //@RunWith(SpringRunner.class)
    @DataJpaTest
    @ContextConfiguration(classes = { LoizBootSpringDemoApplication.class})
    @TestMethodOrder(MethodOrderer.OrderAnnotation.class)
    @SuppressWarnings("unused")
    public class LoizPersistenceTest
    {

    @Autowired
    private TestEntityManager testEntityManager;

    @Autowired
    private UserRepositoryInterface repository;

    private static Long idStub ;

    @Test
    @Order(1)
    @Rollback(false)
    @DisplayName("Test de sauvegarde d\'un user \"prenom21 Nom21\"")
    public void saveShouldMapCorrectly() throws Exception {

    User userStub = new User("prenom21", "Nom21");

    User UserSaved = this.testEntityManager.persistFlushFind(userStub);

    BDDAssertions.then(UserSaved.getId()).isNotNull();
    idStub = UserSaved.getId() ;

    User UserRead = this.testEntityManager.find(User.class, idStub) ;

    BDDAssertions.then(UserSaved.getFirstName()).isNotBlank();
    BDDAssertions.then(UserSaved.getFirstName()).isEqualToIgnoringCase("prenom21");


    BDDAssertions.then(UserSaved.getLastName()).isEqualToIgnoringCase("Nom21");
    BDDAssertions.then(UserSaved.getLastName()).isNotBlank();
    }

    @Test
    @Order(2)
    @DisplayName("Test d'existence du user \"prenom21 Nom21\"")
    public void readShouldMapCorrectly() throws Exception {
    User userStub = new User(idStub, "prenom21", "Nom21");
    User userFetched = this.testEntityManager.find(User.class, idStub) ;

    String sUserStub = userStub.toString() ;
    String sUserFetched = userFetched.toString() ;


    boolean bolSameObject = userStub.equals(userFetched) ;

    boolean bolAttrEgalEgal = sUserStub == sUserFetched ;

    boolean bolStringEqual = sUserStub.equals(sUserFetched) ;

    boolean bBeanUtil = helperUtils.haveSamePropertyValues (User.class,userStub,userFetched) ;


    Assert.assertTrue(bBeanUtil);

    }

    }
    也许这是正常的,但我必须知道什么?
    我希望得到一些答案:)
    >>>> view complete spring boot app code on github available here

    最佳答案

    @RunWith(SpringRunner.class)用于junit 4测试。
    但在我们的例子中,使用的是 Junit 5。这就是我们可以在 pom.xml 上看到的内容。文件(使用 junit.jupiter 工件证明了这一点)。
    所以@RunWith(SpringRunner.class)对管理 spring 容器没有影响。
    它应该被替换为 @ExtendWith(SpringExtension.class) .
    但是:@DataJpaTest已经“包含”@ExtendWith(SpringExtension.class) !!!
    所以我们不需要添加@ExtendWith(SpringExtension.class)@DataJpaTest用来。@DataJpaTest将允许测试 spring 数据存储库层,但也将保证 spring 依赖注入(inject)。
    也就是说,粗略地说,您可以使用 @Autowired被注释的类的注释 @DataJpaTest ( Spring 数据存储库层)。

    关于spring - @Autowired 不应该在没有 @RunWith(SpringRunner.class) 的情况下工作,但可以,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65348079/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com