Unit testing 未返回模拟对象
有一个适配器类调用另一个legacyService,legacyService调用legacyDao,我想模拟遗留服务调用。 在下面的代码中,SomeBean返回为null,而不是我在return中创建并传递的值。这里可能有什么问题?请帮助我,我是模拟框架的新手Unit testing 未返回模拟对象,unit-testing,mockito,powermockito,Unit Testing,Mockito,Powermockito,有一个适配器类调用另一个legacyService,legacyService调用legacyDao,我想模拟遗留服务调用。 在下面的代码中,SomeBean返回为null,而不是我在return中创建并传递的值。这里可能有什么问题?请帮助我,我是模拟框架的新手 public class AdapterImpl implements Adpater{ //Injected through setter or constructor injection private LegacySer
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();
}
}
问题中发布的原始代码有许多拼写错误,如缺少括号和分号。当我纠正它们并填写AdapterImpl.setLegacyService等方法时,测试通过 然后,正如我在评论中所建议的,我删除了对LegacyDAO的嘲笑。如果正确模拟了LegacyServiceImpl.legacyService,则不需要该模拟对象。当我重新运行测试时,它再次通过 所有这些使我相信,将模拟LegacyService对象注入AdapterImpl中存在问题 仅供参考,这是我通过测试的代码,显示了我的打字错误修正和对原始问题中未显示的方法的假设。希望这有帮助
@RunWith(PowerMockRunner.class)
@PrepareForTest({ AdapterImplTest.CommonUtils.class })
public class AdapterImplTest {
@Mock
private LegacyServiceImpl legacyService;
// private LegacyDAO legacyDAO; // removed, no need to mock
@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");
// I am mocking interface method implementation
// PowerMockito.when(legacyDAO.legacyDAO()).thenReturn(bean);
// legacyService.setLegacyDAO(legacyDAO);
// same bean as above
PowerMockito.when(legacyService.legacyService()).thenReturn(bean);
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();
}
private String someString() {
return "hello";
}
public class SomeBean {
public SomeBean(String string, String string2) {
}
}
public interface LegacyService {
public SomeBean legacyService();
}
public interface Adpater {
}
public class AdapterImpl implements Adpater {
// Injected through setter or constructor injection
private LegacyService legacy;
public SomeBean myMethod() {
CommonUtils.someStaticMethod();
return legacy.legacyService();
}
public void setLegacyService(LegacyServiceImpl legacyService) {
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();
}
public void setLegacyDAO(LegacyDAO legacyDAO) {
ldao = legacyDAO;
}
}
public class LegacyDAO {
public SomeBean legacyDAO() {
return null;
}
}
public static class CommonUtils {
public static String someStaticMethod() {
return "in CommonUtils.someStaticMethod()";
}
}
}
由于您是在模拟LegacyService,所以不需要将LegacyDAO也模拟为模拟,而不是使用真实的LegacyService方法。删除模拟LegacyDAO逻辑是否澄清了问题?另外,如果在测试中初始化模拟legacyService而不是使用注释,结果是否相同?AdapterImpl对象是否正在测试中?你想测试哪一类?是的AdapterImpl正在测试中test@sjgp是的,结果是一样的。如果我只模拟legacySrvice,那么我会在legacyDAO.legacyDAO上得到一个空指针异常。谢谢!你是对的,不需要模仿刀…我去掉了所有刀的东西,它起作用了。