java - Mockito - 使用 @Spy 和 @InjectMocks 时如何注入(inject)由构造函数标记为 @Mock 的最终字段

标签 java mockito

我有一个特殊情况,我必须模拟一些字段并在我的类中使用 @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
}

问题是 - 正如代码中所注释的 - 最终字段没有被注入(inject)并且它是空的。当我删除最终关键字时,它会被正确注入(inject),并且所有测试都按预期工作。我尝试了其他主题中的一些技巧 - 也使用反射,但在这种特殊情况下似乎没有任何效果。

最佳答案

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

@InjectMocks 应该为你做这件事。尝试一下

@Spy
@InjectMocks
private ServiceTest service;

关于java - Mockito - 使用 @Spy 和 @InjectMocks 时如何注入(inject)由构造函数标记为 @Mock 的最终字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49668399/

相关文章:

java - 在 Java 中推广?

java - Swing:面板尺寸问题

java - 从 Http Servlet 请求 header 中读取浏览器/客户端时间

c# - GZipInputSteam 解压不适用于大小超过 13239 的数据

java - 为什么我们可以将字符串分配给简单的 Java 对象

spring-boot - SpringBoot @MockBean 和 @WebMvcTest 不起作用

dart - Mockito - 在空安全迁移后 stub 一个方法

java - 如何在 NetBeans 的简单 Java 项目中直接设置 Mockito

java - mockito @Mock 没有按预期注入(inject)命名的@Resource

java - Kotlin Mockito 总是返回作为参数传递的对象