【发布时间】:2012-09-03 11:53:26
【问题描述】:
我有一门课,我正在尝试单元测试。我正在尝试使用 Mockito 对其进行测试,并使用 Springockito 和 Springockito-annotations 来解决使用 mockito 的弹簧注入。
@ContextConfiguration(loader = SpringockitoContextLoader.class,
locations = {"classpath:testApplication-context-EU.xml"})
public class RelatedSearchToHotUrlProcessorTest extends AbstractJUnit4SpringContextTests {
@Autowired
RelatedSearchToHotUrlProcessor processor;
@ReplaceWithMock
private RestOperations restTemplate;
@Test
public void testGetCategoryFromIdWithNoStoredAlias() {
Taxonomy mockTaxonomy = mock(Taxonomy.class, RETURNS_DEEP_STUBS);
GraphType.Node mockNode = mock(GraphType.Node.class);
when(restTemplate.getForObject(anyString(), eq(Taxonomy.class))).thenReturn(mockTaxonomy);
when(mockTaxonomy
.getRev()
.get(0)
.getCountry()
.get(0)
.getGraph()
.getNodeOrAtom()
.get(0)).thenReturn(mockNode);
when(mockNode.getAlias()).thenReturn("mockalias");
String categoryAlias = processor.getCategoryAliasFromId(13130L);
assertEquals("mockalias", categoryAlias);
}
}
如果我删除 @ReplaceWithMock 和 private RestOperations restTemplate 行,那么它会进行正确的调用,并且可以验证该值是否正确。但是,我想在处理器内部模拟 RestOperations 对象,但是使用 @ReplaceWithMock 会使 restTemplate 变量为空,导致它失败。我还没有弄清楚如何隔离这个成员并模拟它。
【问题讨论】:
-
是的,我收到 NullPointerException 异常,因为 restTemplate.getForObject() 调用的 restTemplate 对象为 null,但我希望它是一个模拟对象
-
尝试使用@Autowired 注入
-
如果您定义
RelatedSearchToHotUrlProcessorset.setRestTemplate(),您可以自己注入模拟作为测试的一部分,消除@ReplaceWithMock注释的任何潜在问题
标签: java spring junit mockito springmockito