1

HazelcastInstance とその IMap を嘲笑しました。この IMap オブジェクトを順番にロック、更新、ロック解除するいくつかのメソッド (追加、削除) をテストする必要がありました。しかし、テストを実行しようとすると、Mocked IMap オブジェクトの呼び出しがゼロになっています。テストクラスは次のとおりです。

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

3 に答える 3

0

問題はあなたが嘲笑することです

@Mock
 private HazelcastInstance hazelcastInstance;

クラスコールのテスト時

Hazelcast.newHazelcastInstance()

テストされたクラスのアーキテクチャの問題のそのショー。マップを 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)
于 2016-07-30T07:21:07.933 に答える
0

独自の imap テスト クラスを作成し、このようなメソッドを実装します

パブリック クラス HazelcastMap は IMap を実装します
{


    プライベート マップ map = new HashMap();

    @オーバーライド
    public void putAll(Map m) {

    }

    @オーバーライド
    public int size() {
        0 を返します。
    }

    @オーバーライド
    public boolean isEmpty() {
        false を返します。
    }

    @オーバーライド
    public boolean containsKey(オブジェクトキー) {
        戻り map.containsKey(キー);
    }

    @オーバーライド
    public boolean containsValue(オブジェクト値) {
        false を返します。
    }

    @オーバーライド
    public Object get(オブジェクトキー) {
        戻り map.get(キー);
    }

    @オーバーライド
    public Object put(オブジェクトキー、オブジェクト値) {
        map.put(キー、値);
        戻り値;
    }

    @オーバーライド
    public Object remove(オブジェクトキー) {
        null を返します。
    }

    @オーバーライド
    public boolean remove(オブジェクトキー、オブジェクト値) {
        false を返します。
    }

    @オーバーライド
    public void removeAll(Predicate predicate) {

    }

    @オーバーライド
    public void delete(オブジェクトキー) {

    }

    @オーバーライド
    公共ボイドフラッシュ(){

    }

    @オーバーライド
    public Map getAll(キーを設定) {
        地図を返す;
    }

    @オーバーライド
    public void loadAll(boolean replaceExistingValues) {

    }

    @オーバーライド
    public void loadAll(キーを設定、boolean replaceExistingValues) {

    }

    @オーバーライド
    public void clear() {

    }

    @オーバーライド
    public ICompletableFuture getAsync(オブジェクト キー) {
        null を返します。
    }

    @オーバーライド
    public ICompletableFuture putAsync(オブジェクト キー、オブジェクト値) {
        null を返します。
    }

    @オーバーライド
    public ICompletableFuture putAsync(オブジェクト キー、オブジェクト値、長い ttl、TimeUnit ttlUnit) {
        null を返します。
    }

    @オーバーライド
    public ICompletableFuture putAsync(オブジェクト キー、オブジェクト値、long ttl、TimeUnit ttlUnit、long maxIdle、
        TimeUnit maxIdleUnit) {
        null を返します。
    }

    @オーバーライド
    public ICompletableFuture setAsync(オブジェクト キー、オブジェクト値) {
        null を返します。
    }

    @オーバーライド
    public ICompletableFuture setAsync(オブジェクト キー、オブジェクト値、長い ttl、TimeUnit ttlUnit) {
        null を返します。
    }

    @オーバーライド
    public ICompletableFuture setAsync(オブジェクト キー、オブジェクト値、long ttl、TimeUnit ttlUnit、long maxIdle、
        TimeUnit maxIdleUnit) {
        null を返します。
    }

    @オーバーライド
    public ICompletableFuture removeAsync(オブジェクト キー) {
        null を返します。
    }

    @オーバーライド
    public boolean tryRemove(Object key, long timeout, TimeUnit timeunit) {
        false を返します。
    }

    @オーバーライド
    public boolean tryPut(オブジェクトキー、オブジェクト値、長いタイムアウト、TimeUnit timeunit) {
        false を返します。
    }

    @オーバーライド
    public Object put(オブジェクトキー、オブジェクト値、long ttl、TimeUnit ttlUnit) {
        null を返します。
    }

    @オーバーライド
    public Object put(オブジェクト キー、オブジェクト値、long ttl、TimeUnit ttlUnit、long maxIdle、TimeUnit maxIdleUnit) {
        null を返します。
    }

    @オーバーライド
    public void putTransient(オブジェクトキー、オブジェクト値、long ttl、TimeUnit ttlUnit) {

    }

    @オーバーライド
    public void putTransient(オブジェクト キー、オブジェクト値、long ttl、TimeUnit ttlUnit、long maxIdle、TimeUnit maxIdleUnit) {

    }

    @オーバーライド
    public Object putIfAbsent(オブジェクトキー、オブジェクト値) {
        null を返します。
    }

    @オーバーライド
    public Object putIfAbsent(オブジェクト キー、オブジェクト値、long ttl、TimeUnit ttlUnit) {
        null を返します。
    }

    @オーバーライド
    public Object putIfAbsent(オブジェクト キー、オブジェクト値、long ttl、TimeUnit ttlUnit、long maxIdle、
        TimeUnit maxIdleUnit) {
        null を返します。
    }

    @オーバーライド
    public boolean replace(Object key, Object oldValue, Object newValue) {
        false を返します。
    }

    @オーバーライド
    public Object replace(オブジェクトキー、オブジェクト値) {
        null を返します。
    }

    @オーバーライド
    public void set(オブジェクトキー、オブジェクト値) {

    }

    @オーバーライド
    public void set(オブジェクトキー、オブジェクト値、long ttl、TimeUnit ttlUnit) {

    }

    @オーバーライド
    public void set(オブジェクト キー、オブジェクト値、long ttl、TimeUnit ttlUnit、long maxIdle、TimeUnit maxIdleUnit) {

    }

    @オーバーライド
    public void lock(オブジェクトキー) {

    }

    @オーバーライド
    public void lock(Object key, long leaseTime, TimeUnit timeUnit) {

    }

    @オーバーライド
    public boolean isLocked(オブジェクトキー) {
        false を返します。
    }

    @オーバーライド
    public boolean tryLock(オブジェクトキー) {
        false を返します。
    }

    @オーバーライド
    public boolean tryLock(Object key, long time, TimeUnit timeunit) throws InterruptedException {
        false を返します。
    }

    @オーバーライド
    public boolean tryLock(オブジェクトキー, long time, TimeUnit timeunit, long leaseTime, TimeUnit leaseTimeunit)
        割り込み例外をスローします {
        false を返します。
    }

    @オーバーライド
    public void unlock(オブジェクトキー) {

    }

    @オーバーライド
    public void forceUnlock(オブジェクトキー) {

    }

    @オーバーライド
    public String addLocalEntryListener(MapListenerリスナー) {
        null を返します。
    }

    @オーバーライド
    public String addLocalEntryListener(EntryListenerリスナー) {
        null を返します。
    }

    @オーバーライド
    public String addLocalEntryListener(MapListenerリスナー、述語述語、ブール値includeValue) {
        null を返します。
    }

    @オーバーライド
    public String addLocalEntryListener(EntryListenerリスナー、述語述語、ブール値includeValue) {
        null を返します。
    }

    @オーバーライド
    public String addLocalEntryListener(MapListener リスナー、述語述語、オブジェクト キー、ブール値の includeValue) {
        null を返します。
    }

    @オーバーライド
    public String addLocalEntryListener(EntryListenerリスナー、述語述語、オブジェクトキー、ブール値includeValue) {
        null を返します。
    }

    @オーバーライド
    public String addInterceptor(MapInterceptor インターセプター) {
        null を返します。
    }

    @オーバーライド
    public void removeInterceptor(String id) {

    }

    @オーバーライド
    public String addEntryListener(MapListenerリスナー、ブール値のincludeValue) {
        null を返します。
    }

    @オーバーライド
    public String addEntryListener(EntryListenerリスナー、ブール値のincludeValue) {
        null を返します。
    }

    @オーバーライド
    public boolean removeEntryListener(String id) {
        false を返します。
    }

    @オーバーライド
    public String addPartitionLostListener(MapPartitionLostListener リスナー) {
        null を返します。
    }

    @オーバーライド
    public boolean removePartitionLostListener(String id) {
        false を返します。
    }

    @オーバーライド
    public String addEntryListener(MapListenerリスナー、オブジェクトキー、ブール値のincludeValue) {
        null を返します。
    }

    @オーバーライド
    public String addEntryListener(EntryListener リスナー、オブジェクト キー、ブール値の includeValue) {
        null を返します。
    }

    @オーバーライド
    public String addEntryListener(MapListenerリスナー、述語述語、ブール値includeValue) {
        null を返します。
    }

    @オーバーライド
    public String addEntryListener(EntryListenerリスナー、述語述語、ブール値includeValue) {
        null を返します。
    }

    @オーバーライド
    public String addEntryListener(MapListenerリスナー、述語述語、オブジェクトキー、ブール値includeValue) {
        null を返します。
    }

    @オーバーライド
    public String addEntryListener(EntryListener リスナー、述語述語、オブジェクト キー、ブール値の includeValue) {
        null を返します。
    }

    @オーバーライド
    public EntryView getEntryView(オブジェクトキー) {
        null を返します。
    }

    @オーバーライド
    public boolean evict(オブジェクトキー) {
        false を返します。
    }

    @オーバーライド
    public void evictAll() {

    }

    @オーバーライド
    public Set keySet() {
        null を返します。
    }

    @オーバーライド
    パブリック コレクション値() {
        null を返します。
    }

    @オーバーライド
    パブリック セット entrySet() {
        null を返します。
    }

    @オーバーライド
    public Set keySet(Predicate predicate) {
        null を返します。
    }

    @オーバーライド
    public Set entrySet(Predicate predicate) {
        null を返します。
    }

    @オーバーライド
    パブリック コレクションの値 (述語の述語) {
        null を返します。
    }

    @オーバーライド
    public Set localKeySet() {
        null を返します。
    }

    @オーバーライド
    public Set localKeySet(Predicate predicate) {
        null を返します。
    }

    @オーバーライド
    public void addIndex(文字列属性、ブール値順) {

    }

    @オーバーライド
    public LocalMapStats getLocalMapStats() {
        null を返します。
    }

    @オーバーライド
    public Object executeOnKey(Object key, EntryProcessor entryProcessor) {
        null を返します。
    }

    @オーバーライド
    public Map executeOnKeys(Set keys, EntryProcessor entryProcessor) {
        null を返します。
    }

    @オーバーライド
    public void submitToKey(Object key, EntryProcessor entryProcessor, ExecutionCallback callback) {

    }

    @オーバーライド
    public ICompletableFuture submitToKey(オブジェクト キー, EntryProcessor entryProcessor) {
        null を返します。
    }

    @オーバーライド
    public Map executeOnEntries(EntryProcessor entryProcessor) {
        null を返します。
    }

    @オーバーライド
    public Map executeOnEntries(EntryProcessor entryProcessor, Predicate predicate) {
        null を返します。
    }

    @オーバーライド
    public QueryCache getQueryCache(文字列名) {
        null を返します。
    }

    @オーバーライド
    public QueryCache getQueryCache(String name, Predicate predicate, boolean includeValue) {
        null を返します。
    }

    @オーバーライド
    public QueryCache getQueryCache(String name, MapListener listener, Predicate predicate, boolean includeValue) {
        null を返します。
    }

    @オーバーライド
    public boolean setTtl(Object key, long ttl, TimeUnit timeunit) {
        false を返します。
    }

    @オーバーライド
    public Object aggregate(Supplier supply, Aggregation aggregate, JobTracker jobTracker) {
        null を返します。
    }

    @オーバーライド
    public Object aggregate(Supplier supply, Aggregation aggregate) {
        null を返します。
    }

    @オーバーライド
    public Collection project(射影射影, 述語述語) {
        null を返します。
    }

    @オーバーライド
    public Collection project(プロジェクション プロジェクション) {
        null を返します。
    }

    @オーバーライド
    public Object aggregate(Aggregator aggregator, Predicate predicate) {
        null を返します。
    }

    @オーバーライド
    パブリック オブジェクトの集計 (アグリゲーター アグリゲーター) {
        null を返します。
    }

    @オーバーライド
    public String getPartitionKey() {
        null を返します。
    }

    @オーバーライド
    public String getName() {
        null を返します。
    }

    @オーバーライド
    public String getServiceName() {
        null を返します。
    }

    @オーバーライド
    public void destroy() {

    }
}
于 2020-05-17T18:45:20.410 に答える