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

springboot与构造函数注入模式的集成测试

莫繁
2023-03-14

我试图使用构造函数注入依赖模式。

我想知道在集成测试类上注入JPA存储库的正确方法是什么:

RepoClass

@Repository
public interface MyClassRepo extends JpaRepository<MyClass, Long> {
... methods ...
}

注射后的服务

public class MyClassService {

  private final MyClassRepo myClassRepo;

  public DeviceServiceImpl(final MyClassRepo myClassRepo) {
    this.myClassRepo = myClassRepo;
  }

  public boolean myMethodToTest() {
    ... whatever...
  }
}

测试它:(我的问题来了)

SpringRunner类选项1:构造函数注入

@RunWith(SpringRunner.class)
@ContextConfiguration(classes = MyTestConfigClass.class) // With necessary imports
@SpringBootTest
public class MyClassTester {
  private final MyClassService myClassService;
  private final MyClassRepository myClassRepository;

  public MyClassTester (final MyClassRepository deviceRepository) {
    this.myClassRepository = myClassRepository;
    this.myClassService= new myClassService(myClassRepository); 
  } 

}

由于控制台输出显示:

测试类应该只有一个公共零参数构造函数

SpringRunner级选项2:自动注射

@RunWith(SpringRunner.class)
@ContextConfiguration(classes = MyTestConfigClass.class) // With necessary imports
@SpringBootTest
public class MyClassTester {
    @Autowired
    private MyClassRepository myClassRepository;

    private MyClassService myClassService = new myClassService(myClassRepository);

}

我觉得它正在打破人们想要的模式。

SpringRunner类选项3:空构造函数

@RunWith(SpringRunner.class)
@ContextConfiguration(classes = MyTestConfigClass.class) // With necessary imports
@SpringBootTest
public class MyClassTester {

  private final MyClassService myClassService;
  private final MyClassRepository myClassRepository;

  public MyClassTester () {
    this.myClassRepository = new MyClassRepository(); // Obviously NOT working, since its an interface
    this.myClassService= new myClassService(myClassRepository); 
  } 
}

正如所评论的:显然不起作用,因为MyClassRepository是一个接口

有没有更好的方法来解决这个问题?

共有2个答案

李烨烁
2023-03-14

从留档:

TestContext框架不测试实例化的方式。因此,对构造函数使用@autowmed或@Inject对测试类没有影响。

https://docs.spring.io/autorepo/docs/spring-framework/4.2.0.RC2/spring-framework-reference/html/integration-testing.html#testcontext-夹具di

傅峻
2023-03-14

使用JUnit5。它允许具有多个参数的构造函数。

选项1需要在测试构造函数中添加@autowier

 类似资料:
  • 我把下面的内容看做是构造函数和setter注入的区别之一。有人能用一些简单的例子解释一下下面的区别吗,我对术语完全功能对象和不完全对象有点困惑。 -

  • 嗨,我有一个问题。我想用espresso为Ui编写android测试,为了让测试不是乱七八糟的,我想嘲弄一下我的演示者。 我在应用程序里用匕首。我的配置如下: 我有组件的模块 那么我也有一个用于活动的组件和一个用于组件的模块 那么我的页面就有了子组件 和子组件的模块 然后详细信息activity注入DetailPresenter 然后是使用构造函数注入的presenter 现在在测试中,我要做的是

  • 在像 JavaScript 这种没有类的概念的语言中,如果想创建特定的实例对象,可以通过在函数之前加上 new 关键字来实现。在调用构造函数时可以传入参数以初始化实例对象的属性值。用这种方式创建的实例对象的属性和方法是独立的,不与其他实例对象共享。 在 JavaScript 中,构造函数一般长这样: function FamilyMember( name, age ) { this.name =

  • 我们有一些传统的laravel项目,它们在类中使用正面。 我们最近的项目使用了底层laravel类的依赖注入,facades所代表的类正如Taylor Otwell自己所暗示的那样。(我们对每个类使用构造函数注入,但为了保持示例简短,这里我使用方法注入并使用单个类。) 我知道外表是可以被嘲笑的 这对单元测试很有效。我试图理解的问题是,这些门面是否被“全球”嘲笑。 例如,让我们假设我正在编写一个集成

  • 我想在构造函数中使用Request类,这是我想运行服务器时它给我的错误: 无法自动连接服务"AppBundle\Controller\DetectServiceDetailController":方法"__construct()"引用类"Symfony\Component\HttpFoundation\Request"的参数"$ask",但不存在这样的服务。它不能自动注册,因为它来自不同的根命名空

  • 注入是将依赖注入对象的过程。 构造函数注入很常见。 在此过程中,依赖项作为参数注入构造函数。 请参阅下面的示例。 创建一个名为GuiceTester的java类。 GuiceTester.java import com.google.inject.AbstractModule; import com.google.inject.Guice; import com.google.inject.Inj