Unit testing 未返回模拟对象

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

有一个适配器类调用另一个legacyService,legacyService调用legacyDao,我想模拟遗留服务调用。 在下面的代码中,SomeBean返回为null,而不是我在return中创建并传递的值。这里可能有什么问题?请帮助我,我是模拟框架的新手

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上得到一个空指针异常。谢谢!你是对的,不需要模仿刀…我去掉了所有刀的东西,它起作用了。