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

最佳答案

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

@InjectMocks应该为您做到这一点。尝试一下

@Spy
@InjectMocks
private ServiceTest service;

09-10 00:32
查看更多