2016-06-29 14 views
0

Ich hatte HazelcastInstance und seine IMap verspottet. Ich musste mehrere Methoden testen (addieren, entfernen), die dieses IMap-Objekt in der Reihenfolge gesperrt, aktualisiert, entsperrt haben. Das gespiegelte IMap-Objekt zeigt jedoch keinen Aufruf, wenn ich versuche, den Test auszuführen. Test-Klasse ist wie folgt:IMap, Haselcastinstanz Mock in Junit

@RunWith(PowerMockRunner.class) 
public class Test { 

@Mock 
private HazelcastInstance hazelcastInstance; 
@Mock 
private IMap<Object, Object> imap; // but in actual class instead of Object (K, V) we are having Class Names. private IMap<ClassA,ClassB> imap; 
private TestClass testClass; 
@Mock 
private ClassA a; 
@Mock 
private ClassB b; 
@Test 
public void testAdd() { 
    when(hazelcastInstance.getMap(anyString())).thenReturn(imap); 
    testClass.add(a, b); 
    verify(imap, times(1)).lock(any()); //supposed to be invoked (1 time). But it is showing as zero interaction 
    verify(imap, times(1)).unlock(any()); 
    } 
} 

Klasse getestet werden soll, wie folgt.

public class TestClass { 
private IMap<ClassA, ClassB> imap= Hazelcast.newHazelcastInstance().getMap("constant); 
public void add(final ClassA key, final ClassB value) { 
    if (key == null) { 
     return; 
    } 
    try { 
     imap.lock(key); 
     imap.put(key, value, 3L, TimeUnit.SECONDS); 
    } finally { 
     imap.unlock(key); 
    } 
    } 
} 

Antwort

0

Das Problem ist, dass Sie

@Mock 
private HazelcastInstance hazelcastInstance; 

verspotten Wenn Anruf

Klasse getestet
Hazelcast.newHazelcastInstance() 

Das zeigt die Architektur in getesteten Klasse Probleme. Der beste Weg, eine Map in TestClass zu injizieren - übergeben Sie Konstruktorargumente.

public class TestClass { 
    private final IMap<ClassA, ClassB> imap; 

    public TestClass(IMap<ClassA, ClassB> imap) { 
     this.imap = imap; 
    } 

Jetzt können Sie Instanz von Testclass

IMap imap = mock(IMap.class)  
testClass = new TestClass(imap) 
erstellen