Я изучаю модульное тестирование и столкнулся с проблемой создания окончательной проверки правильности тестового примера. Обычно я пытаюсь создать верификацию, например, через assertEquals(). Но что рекомендуется делать, когда нет возможности проверить это так?
У меня есть такой класс:
public class Landlord {
private Map<String, ChannelHandlerContext> currentOccupier;
private static Landlord instance;
public Landlord() {
currentOccupier = new HashMap<>();
}
public static Landlord getInstance {
//return instance
}
public void add(Occupier occupier){
currentOccupier.put("test", occupier.getChannelHandlerContext());
}
}
И теперь я пытаюсь проверить метод следующим образом:
public class LandlordTest {
private Landlord landlord;
@Mock
private Occupier occupier;
@Mock
private ChannelHandlerContext channelHandlerContext;
@BeforeEach
void setUp() {
occupier = mock(Occupier.class);
channelHandlerContext = mock(ChannelHandlerContext.class);
landlord = Landlord.getInstance();
when(occupier.getChannelHandlerContext()).thenReturn(channelHandlerContext);
}
public void add(Occupier occupier){
addedOccupier.put(occupier.getChannelHandlerContext());
//adding succeded
}
}
Возможно, в этом коротком примере его не нужно было бы тестировать, но есть ли способ убедиться, что метод добавления был успешным? Обычно в таких случаях я бы попробовал что-то вроде: assertEquals(currentOccupier.size(), 1), но здесь я не могу получить доступ к hashMap экземпляра, чтобы сделать это так. Есть ли другой способ проверить правильность его добавления?




Этого assertEquals(currentOccupier.size(), 1) действительно недостаточно.
Вы хотите утверждать, что карта содержит запись, которую вы добавили на карту.
Это утверждение слишком поверхностное: оно не проверяет запись ни на значение ключа, ни на значение значения.
Вы должны сделать что-то вроде:
ChannelHandlerContext actualContext = landLord.get("test");
assertSame(addedContext, actualContext);
// or assertEquals if the instances may differ because you do some defensive copy in add()
Также обратите внимание, что здесь вы издеваетесь над некоторыми вещами, над которыми не стоит имитировать: occupier и channelHandlerContext составляют часть вашей модели. Вы должны иметь возможность предоставить «обычные» их экземпляры в рамках теста.
Здесь у вас есть два способа сделать это:
1) добавление общедоступного метода в тестируемый класс для поиска ChannelHandlerContext :
public ChannelHandlerContext get(String name){
currentOccupier.get(name);
}
Сделайте это Только, если предоставление этого доступа приемлемо.
Если вы не можете добавить общедоступный метод, добавьте метод уровня пакета, так как он не является частью открытого API.
2) использовать API-интерфейс отражения (по сути, Class.getDeclaredField(String) и Field.get()), чтобы получить экземпляр карты из тестируемого экземпляра, а затем подтвердить, что он содержит ожидаемый экземпляр ChannelHandlerContext для ключа «тест».
Точно. Я обновил простой пример для иллюстрации.
Спасибо большое, вы мне в этом помогли!
Значит, недостаточно проверить, был ли пользователь добавлен в список? Что еще нужно проверить, например, убедиться, что пользователь действительно тот же?