Recently I was working on a legacy Java project without any unit tests. Just to get started I wanted to write some unit tests, so I could understand better what was happening in the code. But the code wasn't created to be easily unit tested. Therefore I had to resort to some Reflection API code to set the value of a static property of a class that was used in the code under test. Because the property is static we must pass null
as an argument for the Reflection API Field.set()
method.
package com.mrhaki.java; public class MainTest { @org.junit.Test public void main_success() { ... mockThreadLocal(); ... assertEquals("mrhaki", Holder.getValue()); } private void mockThreadLocal() { ThreadLocal mockThreadLocal = new ThreadLocal<String>(); mockThreadLocal.set("mrhaki"); Field threadLocalField = Holder.class.getDeclaredField("valueThreadLocal"); threadLocalField.setAccessible(true); threadLocalField.set(null, mockThreadLocal); } }
package com.mrhaki.java; public class Holder { private static ThreadLocal<String> valueThreadLocal = new ThreadLocal<String>(); public static String getValue() { return valueThreadLocal.get(); } }