测试依赖于注入依赖项的对象(Spring)?

hivapdat  于 2022-11-21  发布在  Spring
关注(0)|答案(3)|浏览(167)

我是Mockito的新手,正在尝试理解一种方法来对依赖于注入依赖项的类进行单元测试。我想做的是创建依赖项的模拟对象,并使我正在测试的类使用这些对象,而不是Spring注入的常规注入依赖项。我一直在阅读教程,但对如何做到这一点有点困惑。
我有一个类我想这样测试:

package org.rd.server.beans;

import org.springframework.beans.factory.annotation.Autowired;

public class TestBean1 {

    @Autowired
    private SubBean1 subBean1;

    private String helloString;

    public String testReturn () {

        subBean1.setSomething("its working");
        String something = subBean1.getSomething();
        helloString = "Hello...... " + something;

        return helloString;
    }

然后我有了一个类,我想用它作为一个模拟对象(而不是常规的SubBean1类,如下所示:

package org.rd.server.beans.mock;

public class SubBean1Mock {

    private String something;

    public String getSomething() {
        return something;
    }

    public void setSomething(String something) {
        this.something = something;
    }

}

    }

我只想试着运行一个简单的测试,如下所示:

package test.rd.beans;
import org.rd.server.beans.TestBean1;

import junit.framework.*;

public class TestBean1Test extends TestCase
{
    private TestBean1 testBean1;

    public TestBean1Test(String name)
    {
        super(name);
    }

    public void setUp()
    {
        testBean1 = new TestBean1();
        // Somehow inject the mock dependency SubBean1Mock ???

    }

    public void test1() {
        assertEquals(testBean1.testReturn(),"working");
    }
}

我想一定有一些相当简单的方法来做到这一点,但我似乎不能理解教程,因为我还没有上下文来理解他们正在做/解释的一切。如果有人能在这方面提供一些线索,我将不胜感激。

dced5bon

dced5bon1#

如果你使用Mockito,你可以通过调用Mockito的静态mock方法来创建mock。然后你可以把mock传递给你要测试的类。你的setup方法看起来像这样:

testBean1 = new TestBean1();
SubBean1 subBeanMock = mock(SubBean1.class);
testBean1.setSubBean(subBeanMock);

然后,您可以为您尝试使用Mockito的静态when方法测试的任何内容向mock对象添加适当的行为,例如:

when(subBeanMock.getSomething()).thenReturn("its working");
bzzcjhmw

bzzcjhmw2#

在Mockito中,您并不是真的要创建新的“模拟”实现,而是要通过告诉Mockito在调用方法时返回什么来模拟注入依赖项的接口上的方法。
我使用Mockito编写了一个SpringMVC控制器的测试,并像对待任何其他java类一样对待它。我能够模拟出我拥有的各种其他Springbean,并使用Spring的ReflectionTestUtils注入这些bean,以传递基于Mockito的值。我在二月份的博客中写过关于它的文章。它有测试类的完整源代码和控制器的大部分源代码。所以可能太长了放不下里面的东西。
http://digitaljoel.nerd-herders.com/2011/02/05/mock-testing-spring-mvc-controller/

sigwle7e

sigwle7e3#

我无意中发现了这个线程,而试图建立一些模拟稍微复杂的情况,并认为我会分享我的结果,为后代。
我的情况与此类似,我需要模拟依赖关系,但我也想模拟我正在测试的类上的一些方法。

@MockBean
    DependentService mockDependentService
    
    ControllerToTest controllerToTest

    @BeforeEach
    public void setup() {
       mockDependentService = mock(DependentService.class);
       controllerToTest = mock(ControllerToTest.class);
       ReflectionTestUtils.setField(controllerToTest, "dependantService", mockDependentService);
    }
    
    @Test
    void test() {
        //set up test and other mocks 
        //be sure to implement the below code that will call the real method that you are wanting to test
        when(controllerToTest.methodToTest()).thenCallRealMethod();
        //assertions
    }

注意,“dependantService”需要匹配你在控制器上命名的服务示例,如果不匹配,反射将不会找到它并为你注入模拟。
这种方法允许控制器上的所有方法都被默认模拟,然后你可以明确地调用你想使用的真实的的方法,然后使用反射来设置与相应的模拟对象所需的任何依赖关系。
希望这对以后的人有帮助,因为它难住了我一段时间。

相关问题