2016-06-29 1 views
0

j'avais raillé HazelcastInstance et son IMap. J'ai dû tester plusieurs méthodes (ajouter, supprimer) qui font que cet objet IMap est verrouillé, mis à jour, déverrouillé dans l'ordre. Mais l'objet Mocked IMap affiche zéro invocation lorsque j'essaie d'exécuter le test. classe de test est la suivante:IMap, maquette d'exemple Hazelcast dans 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()); 
    } 
} 

classe à tester est la suivante.

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); 
    } 
    } 
} 

Répondre

0

Le problème est que vous vous moquez

@Mock 
private HazelcastInstance hazelcastInstance; 

Lors d'un essai de classe appel

Hazelcast.newHazelcastInstance() 

Ce spectacle des problèmes d'architecture en classe testée. La meilleure façon d'injecter une carte dans TestClass - transmettre les arguments constructeur.

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

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

Maintenant, vous pouvez créer une instance de TestClass

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