@Test
  public void shouldThrowException_WhenOperatingWithNoKey() {
    when(coRepository.lock(noKey)).thenReturn(true);
    when(originalRepository.read(noKey)).thenReturn(Item.withNoValue(noKey));
    sut = new CoRepositoryClient(coRepository, originalRepository);

    try {
      when(coRepository.selectAsInt(noKey)).thenReturn(Item.withNoValue(noKey));
      sut.selectAsInt(noKey);
      fail();
    } catch (NonExistentKeyException e) {
    }

    try {
      sut.update(new Item(noKey, "anyValue"));
      fail();
    } catch (NonExistentKeyException e) {
    }

    try {
      sut.increase(noKey);
      fail();
    } catch (NonExistentKeyException e) {
    }

    try {
      sut.decrease(noKey);
      fail();
    } catch (NonExistentKeyException e) {
    }
  }
  @Test
  public void canSelectIntegerValue() {
    when(originalRepository.read(key)).thenReturn(integerItem);
    when(coRepository.selectAsInt(key)).thenReturn(integerItem);
    sut = new CoRepositoryClient(coRepository, originalRepository);

    Item result = sut.selectAsInt(key);

    assertThat(result, is(integerItem));
  }
  @Test
  public void canDecreaseValue() {
    when(originalRepository.read(key)).thenReturn(integerItem);
    sut = new CoRepositoryClient(coRepository, originalRepository, keyUpdateTime, 1);

    sut.decrease(key);

    verify(coRepository).decrease(key);
    verify(keyUpdateTime, times(2)).notifyUpdated(Mockito.eq(key), Mockito.anyLong());
  }
  @Test
  public void canSelectStringValue() {
    when(originalRepository.read(key)).thenReturn(stringItem);
    when(coRepository.selectAsObject(key)).thenReturn(stringItem);
    sut = new CoRepositoryClient(coRepository, originalRepository);

    Item result = sut.selectAsObject(key);

    assertThat(result, is(stringItem));
  }