【问题标题】:Mock object is not being returned没有返回模拟对象
【发布时间】: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


【解决方案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()";
        }
    }

}

【讨论】:

  • 谢谢!你是对的,不需要模拟 DAO...我删除了所有 DAO 的东西,它起作用了。
猜你喜欢
  • 2013-11-04
  • 2015-02-25
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多