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

如何将最后一个类(如String)注入到Mockito 3中用@InjectMocks注释的类的构造函数中

徐栋
2023-03-14

我想模仿下面的课程:

public class MyRunner {
    private String name;
    private User user;//not final
    public MyRunner(String name, User user) {
      this.name = name;
      this.user = user
    }
    //...something complicated in the methods
}

就像JMockit一样

@ExtendWith(MockitoExtension.class)
public class MyRunnerTest {
    @Inject
    private String name = "sth";
    @Inject
    private User user;
    @Tested
    private MyRunner tested;
}

与Mockito 3类似,

@ExtendWith(MockitoExtension.class)
public class MyRunnerTest {
    @Mock
    private String name;
    @Mock
    private User user;
    @InjectMocks
    private MyRunner tested;
    @Test //from JUnit5
    public void testSth() {
      //...
    }
}

问题:在构造过程中将name字符串注入MyRunner会失败,因为string是最终类。收到如下错误消息

Cannot mock/spy class java.lang.String
Mockito cannot mock/spy because :
 - final class

可以使用新关键字初始化测试的类:

@ExtendWith(MockitoExtension.class)
public class MyRunnerTest {
    private String name = "sth";
    @Mock
    private User user;
    private MyRunner tested = new MyRunner(name, user);
    @Test //from JUnit5
    public void testSth() {
      //...
    }
}

然而,上面的解决方案并不像仅仅使用注释那样流畅

问题:如何将最终类注入到注释为@InjectMocks的对象中,而不是显式地用new关键字构建它?

共有1个答案

关翰
2023-03-14

有很多方法可以做到这一点。以下是3个概念上不同的:

选择1

首先,如果你真的在谈论字符串,那么模仿它可能没有多大意义:基本上你的例子根本不需要mockito。你可以简单地:

public class UserTest {
  private final String NAME = "sampleName;

  private User tested = new User(NAME);

 ...
}

备选案文2

现在,假设你不是真的在这里谈论String类,最好的选择是通过接口编程,创建Mocks相当简单:


public class User {
    public User(Name name) {
      ...
    }

}

public interface Name {
   String getValue();
}

@ExtendsWith(MockitoExtension.class)
public class UserTest

   @Mock
   private Name name;

   @InjectMocks
   private User tested;

选择3

如果您绝对需要模拟静态类,您可以在mockito中这样做,但它需要一些额外的设置:基本上,您在目录src/test/resources/mockito extensions中创建一个文件org.mockito.plugins.MockMaker,该文件将包含:

mock-maker-inline

有关更多信息,请参阅本教程

 类似资料:
  • 问题内容: 我的spring bean具有一个带有唯一强制性参数的构造函数,我设法用xml配置对其进行了初始化: 然后,我像这样使用此bean,并且效果很好。 但是我想用注释指定contructor arg值,例如 这可能吗 ? 提前致谢 问题答案: 首先,必须在bean定义中而不是在注入点中指定构造函数arg。然后,你可以利用spring的注释(spring 3.0) 就我所看到的问题而言,这可

  • 问题内容: 我已经用策略模式实现了一个程序。所以我有一个在某些地方使用的接口,并且可以替换具体的实现。 现在我要测试该程序。我想以类似的方式做。编写一次测试,针对该接口进行测试。应在测试开始时注入具体的接口实现,以便我可以轻松地替换它。 我的测试类看起来与此类似: 在开始测试时,必须使用参数化的构造器来注入具体的策略实施。 现在我没有让TestNG运行它并注入具体的实现实例。我试图与继承几种方法,

  • 我有一个类< code >配置: 配置java 我如何将它注入到某个构造函数中,例如: 我希望这个字符串 从配置中注入了值。这可能吗?

  • 问题内容: 我有一堂课: 配置文件 我如何将其注入一些构造函数,即: 我希望此字符串具有从Config注入的值。那可能吗? 问题答案: 您将必须命名Bean,然后在自动装配引用该名称时使用注释。 例: 配置文件 SomeC.java

  • 我试图了解DI在我们的代码库(Kotlin)中是如何使用的。我们正在使用googleguice进行依赖注入。 下面是一个示例类: 在模块类中: DepB类别: 据我所知,对于用< code>@Inject注释的变量,Google Guice会使用模块类来解决这些依赖关系。所以< code>DepA对象的注入方式是有意义的。 但是呢?我们如何能够在不指定任何位置的情况下注入DepB?

  • 我是Java Guice的新手,在设计应用程序时遇到麻烦。 我将尝试尽可能简单地解释我的设计和期望的结果。 我有一个名为 的接口,以及该接口的 3 个实现,比如 、。 我有一个名为的类,带有以下构造函数: 现在我希望能够使用注解注入