模拟弹簧IOC法注射法



有没有办法用方法注入的方式来模拟由弹簧容器注入的方法?

让我详细解释

我有一个抽象类叫做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加载它。

谢谢。

相关内容

  • 没有找到相关文章

最新更新