我正在尝试模拟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
,则不需要模拟类X
和Y
。您应该只模拟类B
和C
,当然您必须指定调用模拟对象时返回的内容。
下面是一个简单的例子,说明你的类有一个方法。
@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中。