【问题标题】:How to create "deep" mock of a spring bean?如何创建弹簧豆的“深度”模拟?
【发布时间】:2015-10-06 11:23:43
【问题描述】:

我有一个这样的春豆

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

为了测试,我使用 Service mock 创建了一个测试上下文

<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?

【问题讨论】:

    标签: java spring unit-testing junit easymock


    【解决方案1】:

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

    我更喜欢 setter 注入,因为这样您就不需要初始化 Spring Framework。例如:

    @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(){...}
    }
    

    【讨论】:

    • 我不喜欢这个解决方案的两件事,就是因为测试,您必须将设置器添加到您的依赖项中。当你想模拟像 DB 调用这样非常深的东西时,它会变得相当乏味,但要使用真正的 bean(比如你自动装配服务,使用其他服务,你使用其他服务......等等,它以服务器结束调用这是你唯一想模拟的东西,通过使用模拟 bean 作为主要 bean,你不必为此烦恼)。
    • 另外,如果我理解正确,如果我忘记创建 bean,这将导致 NPE。即使在测试之外。在这种情况下,我更喜欢应用程序上下文失败。
    • @terrmith 很好地取决于您如何编写真实代码,我总是添加 setter 注入而不是属性注入,因此在我的情况下,我不需要为 setter 修改代码。如果你只想模拟一个非常深的调用,比如 DB 调用,那么这不是一个真正的单元测试,所以我认为你只想测试服务,而不是一个非常深的调用类。如果你不初始化 otherService 属性,它会抛出一个 NPE,所以如果你在 spring 上下文之外运行你的服务也是一样的。
    • 如果您使用构造函数,那么 Spring 将无法创建对象,但您可以轻松地对其进行测试,而无需使用 DI 容器。见olivergierke.de/2013/11/why-field-injection-is-evil
    • 推荐确实是不用DI测试。您可以使用 ReflectionUtils 设置您的字段。但这不是重构安全的。因此,最好的解决方案通常是将包范围设置器标记为仅用于测试。不要害怕修改代码以使其可测试。包括添加一个 setter。
    猜你喜欢
    • 2012-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-11
    • 2015-10-22
    • 2012-06-29
    相关资源
    最近更新 更多