我正在试图模仿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}}
答案 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
,则不需要模拟课程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);
}
}
答案 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。