FML icon indicating copy to clipboard operation
FML copied to clipboard

ClassCastException when calling Block.class from JUnit test

Open DarkGuardsman opened this issue 9 years ago • 6 comments

Info

I'm currently trying to create a JUnit test for objects in the world. To do this i've created a fake world to mess around in. The world code works well enough that i can get results out of it as needed. Issue is i keep getting this crashing any time ModClassLoader tries to create itself. Which i've figured out how to avoid for the most part but some code doesn't allow me to avoid it. Mainly anything that tries to populate crash reports with instance information.

JUnit Test code

https://github.com/Universal-Electricity/Resonant-Engine/blob/1.7/src/test/java/resonant/lib/test/world/WorldTest.java

Crash

line 46 in ModClassLoader this.mainClassLoader = (LaunchClassLoader)parent;

Caused by: java.lang.ClassCastException: sun.misc.Launcher$AppClassLoader cannot be cast to net.minecraft.launchwrapper.LaunchClassLoader at cpw.mods.fml.common.ModClassLoader.(ModClassLoader.java:46) at cpw.mods.fml.common.Loader.(Loader.java:181) at cpw.mods.fml.common.Loader.instance(Loader.java:160) at cpw.mods.fml.common.FMLCommonHandler.(FMLCommonHandler.java:87) at cpw.mods.fml.common.FMLCommonHandler.(FMLCommonHandler.java:77) ... 31 more

Possible fix?

I'm most likely wrong on this but maybe an instanceof check could be added. This way JUnit tests can at least create the instance even if it doesn't function.

DarkGuardsman avatar Nov 20 '14 17:11 DarkGuardsman

The problem is that many things don't work when not loaded through the LaunchClassLoader. Because many things (Events, etc.) need the ClassTransformers to work, which only work with the LaunchClassLoader.

diesieben07 avatar Nov 20 '14 18:11 diesieben07

Its true that many things need the class loader to work but i'm trying to work around that. Which for my original issue i figured out but it seems odd that so much code tries to self create the class loader. It should be null until created to allow for JUnit testing. As i can always throw up NPE checks in my code.

DarkGuardsman avatar Nov 20 '14 19:11 DarkGuardsman

You can create a special testing tweaker and launch junit through launchwrapper

jeffreykog avatar Nov 20 '14 19:11 jeffreykog

Do you have an example of that, and can this be done threw gradle? I also rather avoid creating an instance of MC if that is what it does.

DarkGuardsman avatar Nov 20 '14 19:11 DarkGuardsman

Well. I think this does not belong in your code. ForgeGradle should provide a tweaker that helps you with that. @AbrarSyed wdyt?

jeffreykog avatar Nov 20 '14 19:11 jeffreykog

When you do junit testing, MC is bit started with the standard tweaking.. So having a custom tweaker just for junit testing won't really help. I also don't know how junit does its classloading..

AbrarSyed avatar Nov 20 '14 22:11 AbrarSyed