Mock对象没有被返回

时间:2017-06-28 19:01:27

标签: unit-testing mockito powermockito

有一个Adapter类调用另一个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();
  }

}

1 个答案:

答案 0 :(得分:1)

问题中发布的原始代码有很多错字,例如缺少括号和分号。当我纠正它们并填写一些方法如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()";
        }
    }

}