Несколько проблем, затрудняющих проверку этого кода:
- Ваша функция shuffle объявлена статической
- Функция вызывает Collections.shuffle, что делает ее очень трудной для насмешки
Вот несколько советов о том, как вы можете протестировать этот метод, хотя они потребуют некоторых изменений в вашем дизайне:
public class WordUtil {
public void shuffle(String word) {
// Store string into array
// -> It is better to code to the interface, eg, List, Set, Map
// than to the implementation, eg. ArrayList, LinkedList, HashMap, etc.
List<Character> wordShuffled = new ArrayList<Character>();
// loop the index of the string
for (int i = 0; i < wordE.length(); i++) {
wordShuffled.add(word.charAt(i));// add the word
}
Collections.shuffle(wordShuffled);// shuffle the word
}
// we are making this method visible only for testing purposes but
// shouldn't be regarded as public API
void shuffle(Collection c) {
Collections.shuffle(c);
}
}
public class WordUtilTest {
private boolean shuffleForCollectionWasCalled;
private Collection collectionForShuffle;
public void testShuffle() throws Exception {
WordUtil util = new WordUtil_ForTest();
String word = "some word";
util.shuffle(word);
assertTrue(shuffleForCollectionWasCalled);
List<Character> expected = new ArrayList<Character>();
for (int i = 0; i < word.length; i++) {
expected.add(word.charAt(i);
}
assertEquals(expected, collectionForShuffle);
}
private static class WordUtil_ForTest extends WordUtil {
@Override
void shuffle(Collection c) {
shuffleForCollectionWasCalled = true;
collectionForShuffle = c;
}
}
}
Хотя это может показаться немного запутанным, нам нужно ввести void shuffle(Collection c)
, потому что он позволяет нам контролировать поведение Collections.shuffle
, делая его детерминированным, а реализация, которую мы имеем в WordUtil_ForTest
, тривиальна, потому что мы не проверяя, как Collections.shuffle
работает (это должно быть хорошо протестировано в JDK), мы просто заботимся о том, чтобы отправить ему правильные параметры.
Вы можете расширить этот тест, добавив условия для обработки нулевых входов и других крайних случаев.