Mockito,测试一个依赖注入依赖项的对象(Spring)?

Ric*_*ick 8 java junit spring mocking mockito

我是新手使用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;
    }
Run Code Online (Sandbox Code Playgroud)

然后我有我想用作模拟对象的类(而不是常规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;
    }


}


    }
Run Code Online (Sandbox Code Playgroud)

我只是想尝试运行这样一个简单的测试:

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");
    }
}
Run Code Online (Sandbox Code Playgroud)

我认为必须有一些相当简单的方法来做到这一点,但我似乎无法理解教程,因为我还没有了解他们正在做/解释的所有内容.如果有人能对此有所了解,我将不胜感激.

小智 8

如果您正在使用Mockito,则可以通过调用Mockito的静态模拟方法来创建模拟.然后,您可以将模拟传递给您尝试测试的类.您的设置方法如下所示:

testBean1 = new TestBean1();
SubBean1 subBeanMock = mock(SubBean1.class);
testBean1.setSubBean(subBeanMock);
Run Code Online (Sandbox Code Playgroud)

然后,您可以为模拟对象添加适当的行为,无论您尝试使用Mockito的静态方法进行测试,例如:

when(subBeanMock.getSomething()).thenReturn("its working");
Run Code Online (Sandbox Code Playgroud)


dig*_*oel 5

在Mockito中你不是真的要创建新的"模拟"实现,而是你要通过告诉Mockito在调用方法时返回什么来模拟注入依赖的接口上的方法.

我使用Mockito编写了一个Spring MVC Controller的测试,并像对待任何其他java类一样对待它.我能够模拟我拥有的各种其他Spring bean,并使用Spring的ReflectionTestUtils注入那些传递基于Mockito的值.我在二月份的博客中写过它.它有测试类的完整源代码和控制器的大部分源代码,所以将内容放在这里可能太长了.

http://digitaljoel.nerd-herders.com/2011/02/05/mock-testing-spring-mvc-controller/