2015-10-06 45 views
2

我有一个春天豆这样如何创建一个春豆的“深”模拟?

@Component 
public class Service extends AbstractService { 
     @Autowired 
     private OtherService otherService; 
} 

为了测试我创建了服务模拟

<bean id="serviceMock" class="org.easymock.EasyMock" factory-method="createMock" primary="true"> 
    <constructor-arg index="0" type="java.lang.Class" value="com.pkg.my.Service"/> 
</bean> 

的模拟测试方面仍然需要我嘲笑所有的自动装配依赖。有没有办法创建“愚蠢的”模拟而不需要为所有的依赖创建bean?

回答

1

你的单元测试是否需要DI?

我更喜欢setter注入,因为那样你就不需要初始化Spring框架。例如:

@Component 
public class Service extends AbstractService { 
    private OtherService otherService; 

    @Autowired 
    public void setOtherService(OtherService otherService){...} 
} 

,然后在您的测试类:

public class ServiceTest { 

    private Service service; 

    private OtherService otherServiceMock; 

    @Before 
    public void setUp() { 
     otherServiceMock= mock(OtherService.class); 
     service = new Service(); 
     service.setOtherService(otherServiceMock); 
    } 

    @Test 
    public void testSomeMethodBlaBla(){...} 
} 
+0

两件事情,我不喜欢这个解决方案,你必须制定者添加到您的依赖关系,只是因为测试。当你想嘲笑像DB调用那样真正深入的东西时,它变得相当乏味,否则使用真正的bean(比如说你自动装载服务,使用其他服务,你使用其他服务等等,并且它以服务器结束调用哪一个是你想要模拟的唯一的东西,通过使用模拟bean作为主要的bean,你不必担心这一点)。 – terrmith

+0

另外,如果我理解正确,如果我忘记创建bean,这将导致NPE。即使在测试之外。在这种情况下,我宁愿应用程序上下文失败。 – terrmith

+0

@terrmith井取决于你如何编码你的真实代码,我总是添加setter注入,而不是属性注入,所以在我的情况下,我不需要修改setter的代码。如果你只想模拟一个像DB调用这样的深呼叫,那么这不是一个真正的单元测试,所以我认为你只想测试服务,而不是一个非常深的调用类。如果你不初始化其他服务属性,它会抛出一个NPE,所以如果你在春天的环境之外运行你的服务,它也会一样。 – gerardribas