【问题标题】:setting mocked object in case of spring annotation在弹簧注释的情况下设置模拟对象
【发布时间】:2013-10-03 18:55:04
【问题描述】:

我正在使用 Junit、EasyMock 和 Spring 编写单元测试用例。我正在尝试模拟 DAO 层调用。我已经使用注解在我的应用程序中注入 bean

服务层类:

public class CustomerService {

  @Autowired
  private CustomerDao customerDao;

   ........

 public void findCustomerByAccountNumber(String accountNumber){

  }
}

服务方法的测试用例:

public class CustomerServiceTest extends AbstractContextConfigLoaderTest{

private CustomerDao mockCustomerDao;
private CustomerService customerService;
private String accountNumber="5247710009575432";

@Before
public void setUp(){
    mockCustomerDao= EasyMock.createMock(CustomerDao.class);
    customerService= new CustomerService(); 
}

如果我通过 Spring bean 配置使用 setter 注入,我会像下面那样将模拟的 dao 对象设置为 customerService。

customerService.setCustomerDao(mockCustomerDao);

如果是 Spring 注释,我该如何做?

【问题讨论】:

    标签: spring junit easymock


    【解决方案1】:

    您仍然可以使用设置方法

    protected void setCustomerDao(CustomerDao customerDao)
    

    并且仅在您的 JUnit 中使用它来设置模拟依赖项。受保护的访问将阻止不在同一个包中的任何类使用该方法。

    【讨论】:

    • 这会弄脏被测类的 API 以进行测试并且因为使用了 Spring。
    【解决方案2】:

    我建议在测试的 spring 上下文中使用 @RunWith(SpringJUnit4ClassRunner.class) 和 @ContextConfiguration 之类的东西在测试中启用 spring 将 mock 设为 spring bean。

    <bean class="org.easymock.EasyMock" factory-method="createMock">
        <constructor-arg value="some.package.CustomerDao" />
    </bean>
    

    现在应该连接到 CustomerService,以记录您需要在测试类中连接模拟的预期行为:

    @Autowired
    private CustomerDao mockCustomerDao;
    @Autowired
    private CustomerService customerService;
    

    【讨论】:

      【解决方案3】:

      为什么不通过构造函数暴露它并以这种方式注入呢?您的生产代码可以使用 Spring,而您的测试代码可以直接实例化该对象。

      目前,您受 DI 框架的支配。打破这种依赖关系。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-01
        • 1970-01-01
        • 2022-11-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多