Мне кажется, что getClosestCode
и getClosestDocumentCode
относятся к другому набору обязанностей , чем findPrincipal
метод. Итак, вы хотите начать с разделения их на два разных класса. Создайте интерфейс для каждого класса для реализации. Класс, который реализует метод findPrincipal
, может затем полагаться на другой интерфейс в качестве аргумента конструктора, например:
public class PrincipalFinderImpl implements PrincipalFinder
{
private CodeFinder codeFinder;
public PrincipalFinderImpl(CodeFinder codeFinder) {
this.codeFinder = codeFinder;
}
public String findPrincipal(List<DocumentKey> documentkeys_) {
Hashtable<String, Integer> codecounts = new Hashtable<String, Integer>();
for (DocumentKey document : documentkeys_) {
int x = 0;
String closestCode = codeFinder.getClosestDocumentCode(document.candidates);
if (closestCode == null) continue;
int thecount = 0;
if (codecounts.containsKey(closestCode))
thecount = codecounts.get(closestCode);
if (document.hasKey)
thecount += 2;
else
thecount++;
codecounts.put(closestCode, new Integer(thecount));
x++;
}
String closestCode = codeFinder.getClosestCode(codecounts);
return closestCode;
}
}
Теперь должно быть легко создать другой класс, реализующий интерфейс CodeFinder
, либо вручную, либо с использованием инфраструктуры Mocking. Затем вы можете контролировать результаты каждого вызова getClosestCode
и getClosestDocumentCode
и убедиться, что каждый из этих методов вызывается именно с теми аргументами, с которыми вы ожидаете вызова.