我在尝试模拟一个服务的属性时,遇到了问题:
@ContextConfiguration("classpath:application-config.xml")
@RunWith(SpringJUnit4ClassRunner.class)
public class FooServiceTests {
@Autowired
private FooServiceImpl fooService;
@Test
public void testFoo() {
String str = fooService.foo();
assertEquals("Var", str);
}
@Before
public void mockFooDao() throws Exception {
FooDao mockFooDao = Mockito.mock(FooDao.class);
Mockito.when(mockFooDao.foo()).thenReturn("Var");
ReflectionTestUtils.setField(fooService, "fooDao", mockFooDao);
}
}
由于结果不符合预期,对fooDao进行模拟没有效果。以下是服务和dao的代码:
@Service("fooService")
public class FooServiceImpl implements FooService {
@Autowired
protected FooDao fooDao;
@Override
public String foo() {
return fooDao.foo();
}
}
@Repository
public class FooDaoImpl implements FooDao {
@Override
public String foo() {
return "foo";
}
}
从我们可以看到,实际服务应该返回"foo",但是测试mock了dao,所以服务返回了"var"。我知道这与CGLIB代理有关,但我无法弄清楚如何在不使用fooDao属性的setter的情况下使其正常工作。任何帮助将不胜感激。
谢谢!
unwrapFooService()
存在一些问题:未解决的名称a
和在条件不为真时缺少返回。我修改了它,以便它可以编译和工作(对我而言)。另外,+1。 - JonikunwrapFooService
。请参见https://dev59.com/6Gsz5IYBdhLWcg3wFT-_#30461953。 - geoand