如何在mockito中模拟Spring依赖项

时间:2015-12-28 16:26:04

标签: java spring unit-testing mockito

我正在试图模仿Spring Beans。我能够模拟对象B和C.但是我无法模拟B类中的对象。 插入A类的模拟包含B.但是即使我嘲笑过它们,X和Y也是空的。在Mockito中有什么方法可以模拟Spring bean中成员成员的对象。

@RunWith(MockitoJUnitRunner.class)
public class ATest {     

    @InjectMocks
    A a = new A();    

    @Mock
    private B b;
    @Mock
    private C c;

    @Mock
    private X x;
    @Mock
    private Y y;
}

我需要在其中填充A类所有依赖项的测试类。

{{1}}

3 个答案:

答案 0 :(得分:2)

你可以做下一步。在这种情况下,B将是间谍对象,因此如果需要,您可以在其上模拟方法结果。或者你可以使用真实的B方法和模拟的X和Y方法。

func bar2<T: MyTypes, U: protocol<MyProtocol, _ArrayType> where U.Generator.Element == T> (arr1: U, _ arr2: U) -> Int? {

    // OK, type 'U' behaves as an array type with elements 'T' (==MyTypes)
    var a = arr1
    var b = arr2
    a.append(T(0))
    b.append(T(0))

    return a.foo(b)
        /* Error: Cannot convert value of type 'U'
           to expected argument type '[_]'          */
}
let myInt2 = bar2(arr1d, arr2d)

答案 1 :(得分:2)

如果您想测试课程A,则不需要模拟课程XY。你应该只模拟类BC,当然你必须指定模拟对象在被调用时返回的内容。

以下是使用一种方法的类的简单示例。

@Named
@Scope(value = "prototype")
public class A {
    @Inject
    private B b;
    @Inject
    private C c;

    public int someMethod(){
        int value = b.otherMethod();

        return Math.abs(value);
    }
}

@Named
@Scope(value = "prototype")
 class B {
    @Inject
    private X x;
    @Inject
    private Y y;

    public int otherMethod(){
        int value = x.something();
        int otherValuey = y.something();

        return value + otherValuey;
    }
}

您的测试可能看起来像这样。

@RunWith(MockitoJUnitRunner.class)
public class ATest {
    @InjectMocks
    private A a;

    //mock only B and C
    @Mock
    private B b;
    @Mock
    private C c;

    public void shouldTestSomething(){
        //given
        Mockito.when(b.otherMethod()).thenReturn(-1); //you specified what happen when method will invoked

        //when
        int value = a.someMethod();

        //then
        Assert.assertEquals(1, value);
    }
}

答案 2 :(得分:0)

您可以将Springs test runner与测试应用程序上下文xml一起使用。

在此测试应用程序上下文中,您可以使用Mockito类上的spring factory方法属性创建任何模拟:

<bean id="mockBean" class="org.mockito.Mockito" factory-method="mock"> 
    <constructor-arg value="com.package.ClassToBeMocked" /> 
</bean>

然后你可以将这个mockBean注入你的另一个bean。