我想避免嘲笑類的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(或者沒有該類的方法),我想確保一些行爲發生了。 –