【发布时间】:2017-06-28 19:01:26
【问题描述】:
有一个适配器类调用另一个 legacyService 和 legacyService 调用 legacyDao 我想模拟 Legacy 服务调用。 在下面的代码中,SomeBean 作为 null 返回,而不是我创建并传入 thenReturn 的那个。这里可能是什么问题?请帮助我是模拟框架的新手。
public class AdapterImpl implements Adpater{
//Injected through setter or constructor injection
private LegacyService legacy;
public SomeBean myMethod(){
CommonUtils.someStaticMethod()
return legacy.legacyService();
}
}
public class LegacyServiceImpl implements LegacyService{
//Injected through setter or constructor injection
private LegacyDAO ldao;//LegacyDAO is an interface
public SomeBean legacyService(){
return ldao.legacyDAO();
}
}
测试类
@RunWith(PowerMockRunner.class)
@PrepareForTest({CommonUtils.class})
public class AdapterImplTest{
@Mock private LegacyServiceImpl legacyService;
private LegacyDAO legacyDAO;
@Before
public void before(){
MockitoAnnotations.initMocks(this);
}
@Test
public void myMethodTest(){
PowerMockito.mockStatic(CommonUtils.class);
PowerMockito.when(CommonUtils.someStaticMethod()).thenReturn(someString());
legacyDAO = PowerMockito.mock(LegacyDAO.class);
SomeBean bean = new SomeBean(sometring1,somestring2);
PowerMockito.when(legacyDAO.legacyDAO().thenReturn(bean);//I am mocking interface method implementation
legacyService.setLegacyDAO(legacyDAO);
PowerMockito.when(legacyService.legacyService().thenReturn(bean);//same bean as above
AdapterImpl impl = new AdapterImpl();
impl.setLegacyService(legacyService)
//Below method call is not returning the bean that I constructed above it is being returned as null
impl.myMethod();
}
}
【问题讨论】:
-
既然你在模拟 LegacyService,你不应该也模拟 LegacyDAO 作为模拟,而不是真正的 legacyService() 方法。删除模拟 LegacyDAO 逻辑是否可以澄清问题?另外,如果你在测试中初始化mock legacyService而不是用注解,结果是一样的吗?
-
AdapterImpl对象正在测试中吗?你想考什么课? -
是的 AdapterImpl 正在测试中
-
@sjgp 是的,结果是一样的。如果我只模拟 legacySrvice,那么我在 legacyDAO.legacyDAO() 上得到一个空指针异常
标签: unit-testing mockito powermockito