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