当前位置: 首页 > 知识库问答 >
问题:

@自动加载不应该在没有@Runwith(SpringRunner.class)的情况下工作,但确实如此

况喜
2023-03-14

下面是java spring数据存储库层的单元测试类。我有一个spring数据存储库层,其中注释@Autowired用于注入TestEntityManager类型的对象(属于spring数据包)。自动连线在不添加@RunWith(SpringRunner.class)注释的情况下工作!那么问题是什么呢?嗯,我认为在没有向类添加@RunWith(SpringRunner.class)注释的情况下,注入是不可能的:从理论上讲,没有它,注入就不可能工作。怎么可能呢?有人有什么答案吗?

  • 其他人在stackoverflow中遇到了相反的问题:

其他人遇到了相反的问题:请参见此处的链接

以下是我奇怪的代码组,其工作原理令人惊讶:

包装组织。洛伊斯。演示;

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

}

也许这很正常,但我必须知道什么?请给我一些答案,我将不胜感激:)

共有2个答案

花烨
2023-03-14

从导入<代码>junit。jupiter我可以看到您正在使用junit-5,而RunWith属于junit-4,作为参考,junit-5测试不强制使用ExtendWith,如果您想使用特定的运行程序,您仍然需要ExtendWith,但由于ExtendWith本身是用ExtendWith注释的,因此无需明确执行此操作

在JUnit 5中,RunWith注释已被更强大的ExtendWith注释所取代。

要使用此类,只需使用@RunAnd(SpringJUnit4ClassRunner.class)@RunAnd(SpringRunner.class)注释基于JUnit 4的测试类。

羊舌昆杰
2023-03-14

@RunAnd(SpringRunner.class)用于jUnit 4测试。但在我们的例子中,使用的是JUnit 5。这就是我们可以在pom.xml文件中看到的内容(使用junit.jupiter工件证明了这一点)。所以@RunAnd(SpringRunner.class)对管理Spring容器没有影响。它应该替换为@ExantAnd(SpringExtension.class)

然而:

@DataJpaTest已经“包含”@extendedwith(SpringExtension.class)!!!因此,当使用DataJpaTest时,我们不需要添加ExtendWith(SpringExtension.class)<代码>@DataJpaTest将允许测试spring数据存储库层,但也将保证spring依赖注入。也就是说,粗略地说,您可以对已注释的类(spring数据存储库层)使用Autowired注释。

 类似资料:
  • 这个问题的上下文是在sping-boot中,使用sping-data-jpa和hibernate。 一个同事写了一个,并用注释了service方法。服务方法加载一个实体,然后命中一个一对多延迟加载的集合(

  • 问题内容: 我正在学习d3。有某些方法可以在d3 js 中加载数据。但是他们似乎都进行了HTTP GET。在我的场景中,我已经在字符串中包含了json数据。如何使用此字符串代替发出另一个http请求?我试图为此寻找文档,但没有找到。 这有效: 现在,如果我有: 如何在d3中使用已计算的“ myjson”并避免对服务器的异步调用?谢谢。 问题答案: 只需将通话替换为 IE浏览器: 更新09/2013

  • 我正在使用Transform创建一个windows安装包,使其成为多实例。我的mst文件更新了某些注册表项组件的产品代码和GUID。这是每台机器安装。现在我无法卸载我的产品,如果: 我的mst文件从其原始位置删除 TransformsSecure策略设置为1 安装程序尝试在原始位置查找mst文件,但无法执行此操作,卸载失败。在这两种情况下,我可以做什么让我的产品卸载? 一些额外信息。我看到我的ms

  • 我是UI自动测试的新手,当只有.apk文件时,我无法弄清楚如何设置UI测试。 在线教程和其他示例没有显示如何使用我的3P. apk文件。我知道在Appium中,只需将文件/目录和名称添加到所需的功能,服务器就会安装它。

  • 我已经安装了Android SDK最新版本和Eclipse。但我也想试试Android Studio。 我看过这个和这个帖子,但是那些解决方案改变了Android Studio(一旦下载并安装)使用的SDK实例。我想要的不是下载另一个SDK,当我已经在我的机器上安装了它。

  • 问题内容: 有什么方法可以在不直接使用Spring Context的情况下加载带有标记的类?基本上,我想重用Spring所做的所有智能逻辑,但是对于在bean生命周期之外手动实例化的bean。 我有一个可以在Spring(引导)中愉快地加载的bean,可以将其注入到其他Service bean中: 详情参见春天docco http://docs.spring.io/spring-boot/docs