我想避免模拟一个类的 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$... 类,因此我的有用对象将始终为空。
有什么方法可以让我绕过模拟课堂,或者我需要做些什么来解决这个问题?
提前致谢。