クラスの getClass() メソッドをモックすることは避けたいのですが、それを回避する方法が見つからないようです。オブジェクト クラス タイプを HashMap に格納するクラスを、後で使用する特定のメソッドにテストしようとしています。これの簡単な例は次のとおりです。
public class ClassToTest {
/** Map that will be populated with objects during constructor */
private Map<Class<?>, Method> map = new HashMap<Class<?>, Method>();
ClassToTest() {
/* Loop through methods in ClassToTest and if they return a boolean and
take in an InterfaceA parameter then add them to map */
}
public void testMethod(InterfaceA obj) {
final Method method = map.get(obj.getClass());
boolean ok;
if (method != null) {
ok = (Boolean) method.invoke(this, obj);
}
if (ok) {
obj.run();
}
}
public boolean isSafeClassA(final ClassA obj) {
// Work out if safe to run and then return true/false
}
public boolean isSafeClassB(final ClassB obj) {
// Work out if safe to run and then return true/fals
}
}
public interface InterfaceA {
void run()
}
public class ClassA implements InterfaceA {
public void run() {
// implements method here
}
}
public class ClassB implements InterfaceA {
public void run() {
// implements method here
}
}
次に、次のような JUnit テストを作成します。
@RunWith(PowerMockRunner.class)
@PrepareForTest({ClassA.class})
public class ClassToTestTest {
private final ClassToTest tester = new ClassToTest();
@Test
public void test() {
MockGateway.MOCK_GET_CLASS_METHOD = true;
final ClassA classA = spy(new ClassA());
doReturn(ClassA.class).when(classA).getClass();
MockGateway.MOCK_GET_CLASS_METHOD = false;
tester.testMethod(classA);
verify(classA).run();
}
}
私の問題は、test() メソッド classA.getClass(); の中にあることです。ClassA を返します。テスターの testMethod() メソッド内に入ると、 ClassA$EnhancerByMockitoWithCGLIB$... クラスが返されるため、有用なオブジェクトは常に null になります。
クラスのモックを回避する方法はありますか、またはこれを修正するために何をする必要がありますか?
前もって感謝します。