2016-06-29 13 views
0

私はHazelcastInstanceとそのIMapを嘲笑していました。このIMapオブジェクトをロック、更新、アンロックした複数のメソッド(追加、削除)をテストしなければなりませんでした。しかし、Mocked IMapオブジェクトは、テストを実行しようとするとゼロの呼び出しを示しています。次のように テストクラスは、次のように試験するIMap、ヘイルキャストインスタンス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()); 
    } 
} 

クラスです。

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

答えて

0

問題は、テストクラスのアーキテクチャの問題を示してクラスのコール

Hazelcast.newHazelcastInstance() 

を試験した場合、あなたは

@Mock 
private HazelcastInstance hazelcastInstance; 

をモックということです。 TestClassにマップを挿入する最も良い方法は、コンストラクタの引数を渡すことです。

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

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

今、あなたは、TestClassを

IMap imap = mock(IMap.class)  
testClass = new TestClass(imap) 
のインスタンスを作成することができます