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

Mockito-如何在使用@spy和@injectmocks时注入构造函数标记为@mock的final字段

慕容安易
2023-03-14

我有一个特殊的情况,在这里我必须模拟一些字段,并为我的类同时使用@mock和@spy,因为在一些测试中我需要改变它自己的方法的行为。我使用@InjectMocks作为构造函数。看起来是这样的:

@RunWith(MockitoJUnitRunner.class)
public class ServiceTest {

    @Mock
    private SomeObject usedAsNonFinal;

    @Mock
    private SomeObject usedAsFinal;

    @Spy
    @InjectMocks
    private ServiceTest service = new ServiceTest(usedAsNonFinal, usedAsFinal);

    @Before
    public void setup() {
        when(usedAsNonFinal.someMethod(Matchers.any()))
                .thenReturn(someObject);

        when(usedAsFinal.someMethod(Matchers.any()))
                .thenReturn(someObject);

        doReturn(someObject).when(service).someMethod(Matchers.any());
    }
}

正在测试的服务:

@Service
public class Service {

    private SomeObject usedAsNonFinal //injects correctly

    private final SomeObject usedAsFinal; //null - not injected

    @Autowired
    public Service (SomeObject usedAsNonFinal, SomeObject usedAsFinal){
    this.usedAsNonFinal = usedAsNonFinal;
    this.usedAsFinal = usedAsFinal;
    }

    //some methods to mock depending on test
}

问题是--正如代码中所评论的那样--final字段没有被注入并且它是空的。当我移除final关键字时,它将被正确地注入,并且所有测试都按照预期工作。我尝试了其他主题中的一些技巧--也使用了反射,但在这个特定的情况下似乎没有任何效果。

共有1个答案

燕鸿波
2023-03-14

您是否尝试在测试中不实例化serviceTest

@injectmocks应该为您做这件事。试试看

@Spy
@InjectMocks
private ServiceTest service;
 类似资料:
  • 我有一个用Mockito测试的类(PriceSetter),这个类有一个内部依赖项(一个数据库)。我想模拟这个内部依赖关系,然后将其注入类中,但在我的构造函数中没有指定依赖关系。因此,Mockito会自动尝试进行构造函数注入,而依赖项永远不会被注入。 我尝试在我的数据库对象上使用@mock,在我的PriceSetter类上使用@injectmocks,但是Mockito自动调用构造函数,它无法注入

  • 问题内容: 我试图监视一个对象,并且想在构造函数调用它之前对构造函数调用的方法进行存根。 我的课看起来像这样: 不能调用setup方法。好吧,我如何监视这种方法(以及存根设置,使其什么也不做)? 模拟方法可以很好地工作,但是我想进行单元测试,因此我将需要其他方法。 之所以需要对设置方法进行打桩以使其无能为力的原因: 我正在对Lego机器人(lejos)进行编程,并在设置中放入了一些代码,该代码需要

  • 我想模仿下面的课程: 就像JMockit一样 与Mockito 3类似, 问题:在构造过程中将字符串注入会失败,因为是最终类。收到如下错误消息: 可以使用新关键字初始化测试的类: 然而,上面的解决方案并不像仅仅使用注释那样流畅 问题:如何将最终类注入到注释为的对象中,而不是显式地用关键字构建它?

  • 问题内容: 我目前正在研究Mockito框架,并且已经使用Mockito创建了一些测试用例。但后来我读到的不是调用模拟( SomeClass的 的.class)我可以使用和-我需要做的唯一一件事情就是我的注释测试类或使用的方法。 但这不起作用-似乎不会起作用!这是我的2个代码修订-一个使用注释,另一个不使用注释。 我究竟做错了什么? 正如我所说-这项工作很棒。但是以下内容不会: 这是课程: 我想念

  • 当使用@InjectMocks时,它会自动尝试按照以下顺序进行注入:构造器、设置器、字段。它通过检查类型来检查是否可以在这些地方中注入,然后在有多种类型的可能性时命名。这对我来说不太好用,因为我的模拟映射锁实际上是通过它的setter注入到dontMockMe中的。我无法编辑此抽象类。有什么办法让我绕过塞特注射吗?提前谢谢!

  • Mockito lib允许用@injectmock注入对象吗?我见过@Spy注释的例子,但当我试图使用它时,总是得到NullPointerException。我知道我总是可以直接使用reflect,但想法是避免这样的代码。