如何在mockito中模拟Spring依赖项



我正在尝试模拟SpringBeans。我可以模拟对象B和C。但不能模拟类B中的对象。插入类A中的mock包含B。但是X和Y是空的,尽管我嘲笑过它们。Mockito中是否有任何方法可以模拟Spring bean中member的member的Objects。

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

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

@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;
}

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

    @RunWith(MockitoJUnitRunner.class)
public class ATest {        
    @Mock
    private X x;
    @Mock
    private Y y;

        @Spy
        @InjectMocks
        private B b;
        @Mock
        private C c;
        @InjectMocks
        A a; 
        @Before
        public void setUp() {
           MockitoAnnotations.initMock(this);
        }
    }

如果要测试类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);
    }
}

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

在这个测试应用程序上下文中,只需在Mockito类上使用springs factory方法属性即可创建任何mock:

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

然后可以将这个mockBean注入到另一个bean中。

相关内容

  • 没有找到相关文章

最新更新