【问题标题】:Mockito - how to inject final field marked as @Mock by constructor when using @Spy and @InjectMocksMockito - 如何在使用@Spy 和@InjectMocks 时注入由构造函数标记为@Mock 的最终字段
【发布时间】:2018-04-05 09:08:32
【问题描述】:

我有一个特殊情况,我必须模拟一些字段并在我的类中使用@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 关键字时,它会正确注入,并且所有测试都按预期工作。我尝试了其他主题的一些技巧 - 也使用反射,但在这种特殊情况下似乎没有任何效果。

【问题讨论】:

    标签: java mockito


    【解决方案1】:

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

    @InjectMocks 应该为你做这件事。试试吧

    @Spy
    @InjectMocks
    private ServiceTest service;
    

    【讨论】:

      猜你喜欢
      • 2023-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多