Какъв е подходящият начин за подигравка на 2 класа, които имплементират интерфейс с Mockito?

Имам 2 класа, които реализират един интерфейс.

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

Сега имам друг клас, наречен CPU, който капсулира DataAccessCache и DataAccessMemory (и двете са частни променливи на екземпляр), като:

private DataAccessCache cache;
private DataAccessMemory memory;

За да се подигравам на тези два класа, имам 2 метода за настройка:

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

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

Искам да тествам CPU метод put(String key, String value), който ще постави key-value двойка в паметта и кеша. Искам да се уверя, че методът put на кеша и методът put на паметта се извикват в метода 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)

Как мога да оправя това?


person knd    schedule 13.11.2012    source източник
comment
Трудно е да се каже без кода за CPU.put()   -  person Peter Svensson    schedule 14.11.2012
comment
Прав си Питър. Тъй като прилагам CPU.put(), той има заключваща система за взаимно изключване. Това означава, че има части, които трябва да заключа за придобиване() и освобождаване(). Проблемът е, че не се подиграх на тези ключалки и ето ни, CPU.put() не може да продължи. Благодаря.   -  person knd    schedule 14.11.2012
comment
Няма проблем - радвам се, че го намерихте   -  person Peter Svensson    schedule 14.11.2012


Отговори (2)


Трябва просто да проверите вашите подигравки в края.

   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");
}
person ShyJ    schedule 13.11.2012
comment
Благодаря, че опитахте ShyJ. Не е проблемът, който посочвате тук. Прочетете коментара по-горе. - person knd; 14.11.2012

Опитайте така:

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, просто го написах от върха на главата си, но мисля, че го разбрах правилно. Опитай.

person Sinisha Mihajlovski    schedule 13.11.2012