0

1 つのインターフェイスを実装する 2 つのクラスがあります。

public interface DataAccess { /*....*/ }
public class DataAccessCache implements DataAccess { /*...*/ }
public class DataAccessMemory implements DataAccess { /*...*/ }

今、私はCPUカプセル化するDataAccessCacheという別のクラスを持っていDataAccessMemoryます(両方ともプライベートインスタンス変数です):

private DataAccessCache cache;
private DataAccessMemory memory;

これら 2 つのクラスをモックするために、2 つのセッター メソッドがあります。

public void setDataAccessCache( DataAccessCache cache ) {
    this.cache = cache;
}

public void setDataAccessMemory( DataAccessMemory memory ) {
    this.memory = memory;
}

ペアをメモリとキャッシュにput(String key, String value)入れるCPUメソッドをテストしたい。key-valueキャッシュの put メソッドとメモリの put メソッドが CPU の put メソッド内で呼び出されるようにしたい。私はそのようにテストしています(Mockitoを使用):

public void test() {
    CPU cpu = new cpu();
    DataAccessCache cache = mock( DataAccessCache.class );
    DataAccessMemory memory = mock( DataAccessMemory.class );
    when( cache.put("key", "value") ).thenReturn(true);
    when( memory.put("key", "value") ).thenReturn(true);
    cpu.setDataAccessCache( cache );
    cpu.setDataAccessMemory( memory );
    cpu.put("key", "value");
    verify( cache ).put("key", "value");
    verify( memory ).put("key", "value");
}

ただし、テスト結果にはエラーがあると記載されています。

java.lang.NullPointerException
at CPU.put(Unknown Source)
at CPUTest.test(Unknown Source)

どうすればこれを正しくすることができますか?

4

2 に答える 2

0

最後にモックを検証するだけです。

   public void test() {
    CPU cpu = new cpu();
    DataAccessCache cache = mock( DataAccessCache.class );
    DataAccessMemory memory = mock( DataAccessMemory.class );
    cpu.setDataAccessCache( cache );
    cpu.setDataAccessMemory( memory );
    cpu.put("key", "value");
    verify( cache ).put("key", "value");
    verify( memory ).put("key", "value");
}
于 2012-11-13T21:21:58.757 に答える
0

次のようにしてみてください。

public void test() {
    CPU cpu = new cpu();
    DataAccessCache cache = spy( new DataAccessCache() );
    DataAccessMemory memory = spy( new DataAccessMemory() );
    //when( cache.put("key", "value") ).thenReturn(true);
    doReturn(true).when(cache).put(eq("key"), eq("value"));
    //when( memory.put("key", "value") ).thenReturn(true);
    doReturn(true).when(memory).put(eq("key"), eq("value"));
    cpu.setDataAccessCache( cache );        
    cpu.setDataAccessMemory( memory );
    cpu.put("key", "value");
    verify( cache ).put("key", "value");
    verify( memory ).put("key", "value");
}

私はこれをIDEに入れておらず、頭のてっぺんから入力しただけですが、正しく理解できたと思います。それを試してみてください。

于 2012-11-13T21:35:00.040 に答える