gpt4 book ai didi

java - 执行 JUnit 测试用例时出现堆栈溢出错误

转载 作者:行者123 更新时间:2023-11-30 06:50:05 26 4
gpt4 key购买 nike

我正在为其编写单元测试的方法有一个方法调用,该方法调用引用另一个抽象类中的方法。该方法被递归调用,这在我执行测试用例时给出了堆栈溢出错误。

下面是正在测试的方法

public void configure(Hashtable config) throws PipeBrokenException
{
// Configure the Pipe Element ...
_source = (String) config.get(this.IMAGE_SOURCE);
_destination = (String) config.get(this.IMAGE_DESTINATION);
_printer = (XrayPrinterIf) config.get(this.PRINTER_INTERFACE);
_configProvider = (AutoPrintConfigProvider) config.get(this.AUTOPRINT_CONFIG_PROVIDER);
TraceLogger.getApplicationLogger().info("AutoPrintEndPoint Configure.. useTaskManager = " +useTaskManager);
if(useTaskManager)
{
mgr = new AutoPrintTaskManager(this);
}
super.configure(config);//this method call gives a stack overflow error, when I comment this my test case runs fine.
}

下面是方法调用的定义super.configure(config);,包含该方法的类是一个抽象类,并且该方法被无限递归地调用,导致出现堆栈溢出错误。

此方法在公共(public)抽象类AnAbstractClass中定义

public abstract class AnAbstractClass{
public void configure(Hashtable properties) throws PipeBrokenException
{
if( _nextNode != null)
{
_nextNode.configure(properties);
}
}
}

这是我的 JUnit 测试用例,我对此和学习仍然是业余爱好者,请随时纠正我的错误,并希望解决我面临的错误。

@InjectMocks
AutoPrintEndPoint autoPrintEndPoint = PowerMockito.spy(new AutoPrintEndPoint("pipeName")); //AutoPrintEndPoint is the class under test
@Test
public void testConfigureHashtable() throws PipeBrokenException
{
// SmartPipeNode node=Mockito.mock(SmartPipeNode.class,Mockito.CALLS_REAL_METHODS);

AutoPrintConfigProvider autoPrintConfigProvider=Mockito.mock(AutoPrintConfigProvider.class); //AutoPrintConfigProvider is an interface
XrayPrinterIf _printerIf=Mockito.mock(XrayPrinterIf.class);//XrayPrinterIf is an interface
Hashtable config=new Hashtable();
config.put(AutoPrintEndPoint.IMAGE_SOURCE,"Source");
config.put(AutoPrintEndPoint.IMAGE_DESTINATION,"Destination");
config.put(AutoPrintEndPoint.PRINTER_INTERFACE,_printerIf);
config.put(AutoPrintEndPoint.AUTOPRINT_CONFIG_PROVIDER,autoPrintConfigProvider);
autoPrintEndPoint.configure("useTaskManager","yes");

//Mockito.doNothing().when(autoPrintEndPoint).configure(config);


autoPrintEndPoint.configure(config);
String _source=Whitebox.getInternalState(autoPrintEndPoint, "_source");
String _destination=Whitebox.getInternalState(autoPrintEndPoint, "_destination");
System.out.println(_destination+"hello destination");
System.out.println(_source+"here");
}

堆栈跟踪

java.lang.StackOverflowError
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$100(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at org.powermock.core.classloader.MockClassLoader.loadModifiedClass(MockClassLoader.java:178)
at org.powermock.core.classloader.DeferSupportingClassLoader.loadClass(DeferSupportingClassLoader.java:68)
at java.lang.ClassLoader.loadClass(Unknown Source)

最佳答案

由于您使用的是 PowerMockito,您应该能够通过以下方式抑制对 AnAbstractClass 中方法的任何调用:

PowerMockito.suppress(MemberMatcher.methodsDeclaredIn(AnAbstractClass.class));

关于java - 执行 JUnit 测试用例时出现堆栈溢出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42995442/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com