有没有办法用方法注入的方式来模拟由弹簧容器注入的方法?
让我详细解释
我有一个抽象类叫做Singleton里面有一个抽象方法
public abstract class Singleton {
protected abstract LoanField check();
private LoanField getLoanField(String name) {
LoanField field = check();
}
对应的配置在spring-config文件中。
<bean id="checkDetails" class="com.abc.tools.Singleton">
<lookup-method name="check" bean="field"/>
</bean>
<bean id="field" class="com.abc.tools.LoanField" scope="prototype"/>
这是我的测试类的简短
Singleton fieldManager = Mockito.mock(Singleton.class, Mockito.CALLS_REAL_METHODS);
LoanField loanField = PowerMockito.mock(LoanField.class);
PowerMockito.when(fieldManager.create()).thenReturn(loanField);
这里的实际问题是,在方法注入中,Spring重写了抽象类的给定抽象方法,并提供了被重写方法的实现,但当我试图在测试类中stub该方法时,我得到以下错误
java.lang.AbstractMethodError: com.abc.tools.Singleton.create()Lcom/abc/tools/LoanField;
at com.abc.tools.SingletonTest.loanFiledNotNull(SingletonTest.java:141)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.junit.internal.runners.TestMethod.invoke(TestMethod.java:66)
at
我知道它不可能存根一个抽象的方法,但有任何工作围绕存根的方法?请帮帮我。
Ps:我在@preparefortest
中提到了所有的依赖类
创建一个扩展抽象类的虚拟类,添加虚拟实现并测试这个类
Try with spy,
Singleton s = new Singleton(){
private LoanField getLoanField(String name) {
LoanField field = check();
}
protected LoanField check(){
return new LoanField();
}
}
Singleton fieldManager = spy(s);
LoanField loanField = mock(LoanField.class);
when(fieldManager.create()).thenReturn(loanField);
如果对象是通过方法注入创建的,那么最好的方法是在测试代码之上使用下面的代码片段,当我们运行测试用例@contextconfiguration时,将为抽象类创建对象,您也将获得抽象方法。
@RunWith(MockitoJUnitRunner.class)
@PrepareForTest({LoggerFactory.class,Class.class})
@ContextConfiguration("file:src/test/resources/META-INF/spring-config-test.xml")
public class TestClass {
基本上你应该有一个测试xml文件,它与实际的xml文件相同,并使用@contextConfiguration加载它。
谢谢。