我有一个特例,我必须模拟一些字段并同时使用@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关键字时,它会被正确注入,并且所有测试都按预期工作。我尝试了其他主题的一些技巧 - 也使用反射,但在这种特殊情况下似乎没有任何工作。
答案 0 :(得分:2)
您是否尝试过不在测试中实例ServiceTest
?
@InjectMocks应该为你做。试试吧
@Spy
@InjectMocks
private ServiceTest service;