我想避免嘲笑类的getClass()方法,但似乎无法找到任何方法。我试图测试一个类,它将HashMap中的对象类类型存储到稍后使用的特定方法中。这方面的一个简单的例子是:用PowerMockito嘲笑getClass方法
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 $ ...类,所以我的对象有用将始终为空。
有什么办法可以解决这个问题吗?或者我需要做些什么来解决这个问题?
在此先感谢。
看起来你不应该首先关心嘲笑getClass。你会发布关于测试本身的一些细节吗? – Vitaliy
我同意,你试图断言什么? 'testMethod()'返回的是无效的,所以没有任何东西可以'assert',它看起来不像你更新传入的参数对象。因此我只能假设有一些方法调用来自里面testMethod(),你想'验证'的互动 – Brad
我希望使用mockito来验证测试中发生了一些行动。我的地图实际上将类类型存储到方法中,以便我可以为实现接口的每个类调用方法,然后如果相关方法返回true(或者没有该类的方法),我想确保一些行为发生了。 –