Тесты Mockito работают отдельно, но при совместном запуске работает только один - PullRequest
0 голосов
/ 01 августа 2020

Я столкнулся со странной проблемой. В моих тестовых примерах есть два неудачных теста, первый и третий. Однако, если я запускаю то же самое по отдельности, он работает отлично. Я новичок в JUnit и понятия не имею, почему это могло произойти. Я пытался повторно использовать моки и инициализировать их в методе setUp (), но это не помогло. Есть ли проблемы с кешем stati c?

import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;

import static org.junit.jupiter.api.Assertions.*;

class CharCounterTest {

    private CharCounter charCounter;
    private CharCounter spyCharCounter;

    @BeforeEach
    public void setUp() {
        charCounter = new CharCounter();
        spyCharCounter = Mockito.spy(charCounter);
    }

    @AfterEach
    public void cleanUp(){
        Mockito.reset(spyCharCounter);
    }

    @Test
    void given3IdenticalInputs_whenGetCharacterFrequency_thenPutInputInCacheOnce() {
        //CharCounter charCounter = Mockito.spy(new CharCounter());
        spyCharCounter.getCharacterFrequency("hello world!");
        spyCharCounter.getCharacterFrequency("hello world!");
        spyCharCounter.getCharacterFrequency("hello world!");

        Mockito.verify(spyCharCounter, Mockito.times(1)).countCharacters("hello world!");
    }

    @Test
    void given3DiffrentsInputs_whenGetCharacterFrequency_thenPutInputInCacheThrice() {
        //CharCounter charCounter = Mockito.spy(new CharCounter());
        spyCharCounter.getCharacterFrequency("hello world!");
        spyCharCounter.getCharacterFrequency("hello!");
        spyCharCounter.getCharacterFrequency("world!");

        Mockito.verify(spyCharCounter, Mockito.times(1)).countCharacters("hello world!");
        Mockito.verify(spyCharCounter, Mockito.times(1)).countCharacters("hello!");
        Mockito.verify(spyCharCounter, Mockito.times(1)).countCharacters("world!");
    }

    @Test
    void given2IdenticalAnd1DiffrentInputs_whenGetCharacterFrequency_thenPutInputInCacheTwice() {
        //CharCounter charCounter = Mockito.spy(new CharCounter());
        spyCharCounter.getCharacterFrequency("hello world!");
        spyCharCounter.getCharacterFrequency("hello world!");
        spyCharCounter.getCharacterFrequency("world!");

        Mockito.verify(spyCharCounter, Mockito.times(1)).countCharacters("hello world!");
        Mockito.verify(spyCharCounter, Mockito.times(1)).countCharacters("world!");
    }
}```

/*There's a CharCounter class, maybe there is some problems with static cache?
*/

```public class CharCounter {

    private static final CacheDecorator cache = new CacheDecorator(new LinkedHashMap<>());

    public Map<String, Long> getCharacterFrequency(String text) {

        Map<String, Long> characterFrequency;
        if (cache.containsKey(text)) {
            characterFrequency = cache.getData(text);
        } else {
            characterFrequency = countCharacters(text);
            cache.putData(text, characterFrequency);
        }
        return characterFrequency;
    }

    public Map<String, Long> countCharacters(String text) {
        Map<String, Long> frequencies = Arrays.stream(text.split(""))
                .collect(Collectors.groupingBy(Function.identity(), LinkedHashMap::new, Collectors.counting()));
        return frequencies;
    }
}```

1 Ответ

0 голосов
/ 01 августа 2020

Была проблема в кеш-памяти c, если вы так напишете тесты, все заработает

@Test
    void given3IdenticalInputs_whenGetCharacterFrequency_thenPutInputInCacheOnce() {
        spyCharCounter.getCharacterFrequency("hello world!");
        spyCharCounter.getCharacterFrequency("hello world!");
        spyCharCounter.getCharacterFrequency("hello world!");

        Mockito.verify(spyCharCounter, Mockito.times(1)).countCharacters("hello world!");
    }

    @Test
    void given3DiffrentsInputs_whenGetCharacterFrequency_thenPutInputInCacheThrice() {
        spyCharCounter.getCharacterFrequency("my name is!");
        spyCharCounter.getCharacterFrequency("my!");
        spyCharCounter.getCharacterFrequency("name!");

        Mockito.verify(spyCharCounter, Mockito.times(1)).countCharacters("my name is!");
        Mockito.verify(spyCharCounter, Mockito.times(1)).countCharacters("my!");
        Mockito.verify(spyCharCounter, Mockito.times(1)).countCharacters("name!");
    }

    @Test
    void 
 given2IdenticalAnd1DiffrentInputs_whenGetCharacterFrequency_thenPutInputInCacheTwice() {
        spyCharCounter.getCharacterFrequency("something!");
        spyCharCounter.getCharacterFrequency("something!");
        spyCharCounter.getCharacterFrequency("problem!");

        Mockito.verify(spyCharCounter, Mockito.times(1)).countCharacters("something!");
        Mockito.verify(spyCharCounter, Mockito.times(1)).countCharacters("problem!");
    }
...